《Effective C++学习》学习笔记01-03

Effective C++ (学习笔记详解 01~03) Effective C++ (学习笔记详解) 文章目录Effective C++ (学习笔记详解)01 :视C++为一个语言联邦02: 尽量const、enum、inline替换#define1、const2、enum3、inline03 :尽可能使用const1、**`const`语法使用**2、STL迭代器3、const成员函数 01 :视C++为一个语言联邦 C++的四个次语言: C:C++是在C语言的基础上发展而来的; Object-Oriented C++:这是C++中不同于C的部分,这里 阅读详情

Effective C++学习

第0章导读

术语(terminology)

声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节

extern int x;
std::size_t numDigits(int number);
class Widget;
template<typename T>
class GraphNode;

签名式(Signature):揭示函数的参数和返回类型,std::size_t(int)说明函数numDigit的参数是Int型,返回类型是std::size_t
定义式(Definition):提供编译器一些声明式所漏的细节。被声明为explicit的构造函数比non-explicit兄弟更受欢迎,作者建议除非有特别好的理由允许构造函数被用于隐式转换,建议都加上explicit声明.以组织隐式转换。
初始化(Initialization):给予对象初值
类作为参数传递,最好采用引用类型,而不是pass-by-value
STL是所谓的标准模板库(Standard Template Library),是C++标准程序库的一部分,致力于容器(vector, list, set, map)、迭代器(vector::iterator, set::iterator等等)、算法(for_each, fidn, sort)。建议读者熟悉STL
不明确定义(undefined behavior):野指针、数组索引越界(竭力避免)

int* p = 0;
std::cout << *p;

char name[] = “hello”
char c = name[10]

TR1和BOOST

TR1(Technical Report1):是一份规范,描述加入C++标准程序库的诸多新机能。这些机能以新的class template 和 function template形式体现, 针对的题目有hash table, referencing-consuming,regular expression,所有的TR1组件在命名空间tr1内,后者嵌套与命名空间std内。
boost:是一个组织,同样是一个网站(boost), 提高可移植的、同行评审源码开放的C++程序库。

第1章 让自己习惯C++

条款01 视C++为一个语言联邦(fedreation)

为了了解C++,你必须认识其主要的次语言(sublanguage)。

  • C 说到底,C++仍是以C为基础(blocks, statement, preprocessor, built-in data types, array, pointers)。但是没有templates, exception, overloading
  • objected-oriented C++.包括构造函数,析构函数, 封装(encapsulation), 继承(inheritance)、多态(polymorphism)、virtual函数(动态绑定)
  • templateC++
  • STL

条款02 尽量以const, enum, inline替换#define(宁可以编译器替换预处理器)

#define PI 3.14

编译过程如图:
编译过程图
#define在预处理阶段被预处理器移走, 可能会带来编译错误。
解决办法:

const double PI = 3.14

特殊情况:
如果是字符串常量,则需要两个const,限制指针以及其指向的内容均不可变

const char* const a = "nihao"//第一个const被指物不可变(*左侧),第二个限制指针本身不可变(*右侧)
//上一行代码等同于 char const * const a = "你好"(关键看const的位置和*的位置关系)
//第二种写法(建议)
const std::string autorname("Scott")

如果是class专属常量,按下声明

class GamePlayer
{
private:
	static const int NumTurns = 5;//声明常量式
	int score[numTurns];//使用常量式
}

class专属常量不同于一般常量,一般常量需要给出定义式,专属常量给出声明式就可以使用, 如果必须提供专属常量定义式,按如下定义:

const int GamePlayer::NumTurns;//定义式应该放在实现文件(.cpp),并且不需要再次赋值

enum最大的好处是无法取址以及无法引用,适当的情况下采用enum也可。

class GamePlayer
{
private:
	enumerate{ NumTurns = 5};//声明常量式
	int score[numTurns];//使用常量式
}

函数模板替代宏
参考代码:

typename<typename T>
inline void CallWithMax(const T&a, const T&b)
{
	f(a > b ? a : b);//a和b中的较大值作为参数
}

总结

  • 对于单纯常量,采用const和enum替代#define
  • 对于形似函数的宏,采用inline函数替换#define

条款03 尽可能的用const

char greeting[] = "Hello";
char* p = greeting;  //p和(*p)都不是常量
const char* p = greeting  //(*p)是常量(被指物)
char* const p = greeting  //p是常量(指针本身)
const char* const p = greeting  //p和(*p)都是常量

const在STL中的应用
STL迭代器中的T指针是一个T const指针,也即可以改变*iter的值,但是不能改变iter的值。
如果想要与上述情况相反,则采用const_iterator

std::vector<int> vec;
const std::vector<int>::iternator iter = vec.begin();  //相当于T* const
*iter = 10;  
++iter;  //不可
std::vector<int>::const_iternator cIter = vec.begin();  //相当于const T* 
*iter = 10  //不可
++iter;

cosnt在函数声明式的应用

  • 返回一个const对象(一般是指针类型或者引用类型)

  • const用于成员函数
    成员函数参数采用引用传递或者指针,采用const修饰
    限定不能修改成员变量(除了static类型的)

    如何修改const变量的值?

    const MyString hello("hello");  //MyString是自己定义的一个类
    cout << hello << endl;  //hello
    char* a = &hello[1];  // char& operator[](int n) const;
    cout << "a: " << a << " " << endl; //a:e
    *a = 'l';
    cout << hello << endl;  //hlllo

这就是所谓的logical constness,一个const成员函数可以修改成员变量的某些bits。
使用mutable关键字仍然可以达到上述目的,const成员函数可以在函数实现中更改mutable成员变量。
总结

  • const可用于对象,函数参数,函数返回类型,成员函数本体
  • const成员函数和non-const成员函数有着实质等价的实现时, 让non-const版本调用const版本可避免代码重复。

参考:
预处理器说明
C语言编译过程
Static关键字作用
Const关键字作用

Effective C++ 学习笔记 第一章:让自己习惯 C++ 本来看这本书已经好几天了,没准备做笔记,但看了几个条款,发现这本书总结的太好了,不记一下,回头忘了不好,如果对其他人有帮助就更好了。 文章目录条款 01:让自己习惯 C++原文建议条款 02:尽量以const, enum, inline 替换 #define话题 1:用 const 和 enum 代替 #define 常量话题 2:用 inline 取代 #define 宏话题 3:#define 不等同于预处理操作原文建议条款 03:尽可能使用 const话题 1:const 修饰指针话题 2:con. 阅读详情

相关推荐

effective c++

条款01:视C++为一个语言联邦 C++主要的次语言总共只有四个(sublanguage) C:C++仍然是以C为基础,区块,语句,预处理器,内置数据类型,数组,指针等 Object-Oriented C++:这部分就是C with Class,类,封装,继承,多态,虚函数等 Template C++:这是C++的泛型编程,template metaprogramming (TMP 模板元编程) STL:template程序库,由容器,迭代器,算法以及函数对象所组成 每个次语言都有自己的规约,C++高效编

heaven5heep blog 789

RuntimeWarning: Glyph 8722 missing from current font. font.set_text(s, 0.0, flags=flags)

利用matplotlib绘图时负号不显示,且报错8722 解决办法: plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

weixin_44032244的博客 7888

Effective C++学习笔记

一、让自己习惯C++条款01:视C++为一个语言联邦C++并不是一个带有一组守则的一体语言:他是从四个次语言**( C、Object-Oriented C++、Template、STL )...

编程与实战的博客 1421

已解决UserWarning: Glyph 8722 (\N{MINUS SIGN}) missing from current font. fig.canvas.print_figure(byt

已解决UserWarning: Glyph 8722 (\N{MINUS SIGN}) missing from current font. fig.canvas.print_figure(bytes_io, **kw)

努力让自己发光,对的人才能迎着光而来 2万+

Glyph Data

修改字体必备软件,修改,制作字体的软件。英文版

【Ubuntu2404】Ubuntu24.04安装NVIDIA驱动/CUDA/cuDNN搭建神经网络训练环境

NVIDIA 驱动、CUDA和cuDNN是紧密相关但各自具有独特功能的技术,它们共同为图形处理单元(GPU)加速的应用程序提供了强大的支持。本文主要介绍如何安装 `NVIDIA` 驱动、CUDA及cuDNN,为后续神经网络训练提供支持。本文主要介绍Ubuntu24.04安装NVIDIA驱动、CUDA和cuDNN的流程。

王阿巴和王咕噜 1万+

Glyph 8722 missing from current font, matplotlib画图

背景: win10, anaconda 4.8.3, python3.8.3 matplotlib画图, 小程序运行时,图像中坐标轴“负号”显示不全,(我这里)表现为“方框”,图片见下面。 关闭图像后, 有的情况下会有Glyph8722 warning提示,有的没有。 办法 这里的错误提示,只给出Glyph 8722 missing from current font …,不容易联系到和坐标轴的负号显示相关。比如下面代码段中#subplot(233) 这个图的代码画图后,会有这个提示。 有的情况下,负

个人笔记 2万+

【机器视觉】Halcon 最新版本安装教程(HALCON 24.11.1.1 Progress-Steady)

注:如果使用评估版本,下载前先了解最新评估授权密钥所支持的版本。。近几年不同版本安装过程类似,均可参考本教程。

OpenSeek的博客 3万+

RuntimeWarning: Glyph 8722 missing from current font. font.set_text(s, 0.0, flags=flags) #15062解决办法

matplotlib绘制的图里面不能正常显示中文,提示警告。 解决办法:matplotlib绘图中文警告 linux终端输入:lang=zh family 我选择的是AR PL UKai CN 代码段如下图: 问题就解决~~ 参考连接“ github ...

miss_future的博客 2万+

Maxwell参数化建模

MAXWELL 2019 R3 参数化建模 参数化建模的优势 所谓参数化,就是在电机本体设计中涉及到的各类参数变量化,而每个变量之间又存在一定的制约关系,这样只需修改其中某个或者某些变量就可以做到对整个电机模型合理地改动。 参数化举例 以表贴式电机为例,先画电机定子,如上所示,依次进行后会弹出下面的选项框 上图就是描述电机尺寸的各类参数,接下来进行参数化。 回车ENTER,并给变量ds赋值。 赋值好后,回车ENTER 左下角properties里面就有我们新建立的变量ds了。 继续将剩余的参数

qq_41387280的博客 1万+

高质量文献综述原来这么写!借助Gemini 3 Pro+四步法,手把手教你写出有逻辑深度的综述

总结与展望先总结现状,说明前人已经做到什么地步了,再指出缺口,前人没解决什么问题、方法有什么局限等等,最后再在这个缺口的基础上,提出你的未来研究方向。当你有个复杂的研究题目,但没办法拆解出关键词,就可以让Gemini 3 Pro来辅助帮你拆解,并帮你写专业的检索式,若是找英文文献,还能帮你将中文关键词翻译成地道的专业术语。做文献笔记,可以建立文献笔记矩阵,可以用Excel建个表格,横向是文献,纵向是关键要素,包括作者/年份、研究问题/假设、理论框架/模型、研究方法/数据来源、核心结论、局限性/Gap。

智能AI让学术科研更容易 992

Matplotlib绘图显示缺少中文字体-RuntimeWarning: Glyph 8722 missing from current font.

pyplot 并不默认支持中文显示,也没有自带中文字体,因此需要自行下载所需字体,并修改 rcParams 参数来显示中文。下面以 SimHei (黑体)字体为例进行说明。 说明:系统环境为 Linux 安装字体 1.下载 SimHei.ttf 字体文件 2.查看 matplotlib 的字体路径 import matplotlib print(matplotlib.matplotlib_fname()) 得到的路径(如~/.local/lib/python3.6/site-packages/

FSKEps的博客 1万+

华为OD机试真题 新系统 9月16号 【统计特殊数字】

华为OD新系统机试真题【统计特殊数字】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【统计特殊数字】。

qq_45776114的博客 769

Effective C++学习笔记(一)

目录 条款01 条款02 条款03 条款04 条款01 内置类型,值传递比引用传递更高效。 用户自定义类型,因为存在构造函数和析构函数,使用pass-by-reference-const会更好,尤其是使用模板时。 条款02 尽量以cosnt,enum, inline,替换#define class的专有常量,一般将常量的作用域限制于class中,此时它应该为一个成员变量,为了确...

hh_h_hhh_d的博客 350

UNet改进(12):融合小波变换与注意力机制的图像分割新方法

本文提出了一种改进的WaveletAttentionUNet架构,通过结合小波变换和注意力机制来增强传统UNet的多尺度特征提取能力。该网络使用分组卷积模拟小波分解,将输入通道扩展为4个子带(LL、LH、HL、HH),并通过通道注意力机制自适应加权各子带特征。网络保留了UNet的编码器-解码器结构,在关键位置集成了WaveletAttention模块。实验证明该方法在医学图像分割等任务中能更好地保持边缘细节和复杂纹理特征,同时保持计算效率。

2501_91516851的博客 758

Docker:快速部署 Temporal 工作流引擎的技术指南

Temporal是一个开源的分布式工作流引擎,适用于复杂业务流程(如订单处理、支付流程等),提供状态持久化、自动重试、多语言SDK支持等特性。部署简单,支持Docker Compose,包含核心服务、Web UI及数据库。以TypeScript为例,开发者可快速编写工作流(如订单处理)和Worker,通过CLI或SDK启动和管理。Temporal简化了分布式系统的可靠性设计,适合电商、自动化任务等场景。

木头 641

Effective C++ 学习笔记

C++程序员分为两种,一种是读过Effective C++的,一种是没读过。这本《Effective C++》 能够协助成为高效的C++开发者。简直是C++开发者的分水岭。 必须细读多遍。 本人小硕菜鸡一枚,非科班,准备今年7月从事C++开发者,修炼内功,一天学习一个effective C++条款。欢迎大佬指导讨论。 fighting!

Ref.Ptr.的博客 3869

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

《Effective c++》学习笔记

《Effective c++》学习笔记第1章 让自己习惯C++01 视c++为一个语言联邦02 尽量以const、enum、inline替换#define03 尽可能使用const04 确定对象被使用前已先被初始化第2章 构造、析构、赋值运算05 了解C++默默编写并调用哪些函数06 若不想使用编译器自动生成函数,就该明确拒绝07 为多态基类声明virtual析构函数08 别让异常逃离析构函数功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列

沟沟沟的博客 1040

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

《Effective C++》学习笔记

Effective C++ 学习1 [条款1--条款30]

zaizai1007的博客 1472

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++】万字详解Effective C++

本文为前段时间读《Effective C++》(侯捷译)时做的个人笔记。

Friday 4290

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【学习笔记】Effective C++

【Effective C++】学习笔记 条款01、视C++为一个语言联邦 条款02、尽量以const、enum、inline替换#define #define是使用预处理器进行处理,无法被编译器知道,因此在发生错误时无法进行追溯。 条款03、尽可能使用const const的使用, 条款04、确定对象被使用前已经被初始化 条款05、 条款06、 条款07、 条款08、 条款09、 条款10、 条款...

weixin_43319685的博客 461

Effective(Modern)C++笔记01

Effectice C++01 条款01:视C++为一个语言联邦 C 区块(blocks)、语句(statements)、预处理(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers) Object-Oriented C++ classes(包括构造和析构函数)、封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual(动态绑定) Template 泛型编程、模

qq_44745589的博客 535

Effective C++

可增加程序的清晰度并改善程序效率class Apublic:public://绝不class Apublic:public://绝不编写类模板,而它提供于此模板相关的函数支持所有参数隐式转换时,需要为这个类模板增加内部friend函数public://增加friend + 声明 + 定义private:T re, im;

weixin_44332995的博客 1002
上一篇: 剑指刷题之复杂链表复制
下一篇: EffectiveC++04-11
miss_future
博客等级 码龄9年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值