【Cpp 进阶】Effective C++ 总结提炼版
版权声明:本文为CSDN博主「无情码手」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Mars1533/article/details/128773881
导读
- size_t 只是一个typedef,是unsigned类型,也是vector,deque,string内的operator[]函数接受的类型. 其头文件为
<cstddef>
- definition定义式,对于变量:任务是编译器拨发内存,对于function:提供代码本体
- 判别拷贝构造和拷贝赋值:有无新对象实例的产生,如果是对已有对象赋值->拷贝赋值
- 参数传递,函数返回,都调用的是拷贝构造。(因为还不是已有对象嘛)
- 对于已经初始化的对象,再次调用 = 是拷贝赋值
- 需要注意的是,调用“=”可能是拷贝构造,而不一定就是拷贝赋值哦,如果还没构造出的话,就是拷贝构造。
- operator= 返回的类型是引用类型&,赋值操作是在函数内就完成的,再次返回对象是为了能连等。
如果返回的不是引用(而是对象)的话,就会调用拷贝构造创建出临时对象temp,加大了开销。
- lhs -> left hand side、rhs -> right hand side
- TR1 -> Technical Report 1(c++新机能)
- boost 一个组织(网站)提供可移植,源码开放的c++程序库
1. 视C++为一个语言联邦
- C
- Object-Oriented C++
- Template C++
- STL
额外补充:
- 内置类型pass by value 即可, pass by reference 开销更大
2. 尽量以const, enum, inline替换 #define
const:
首先,从处理阶段来说,const是在编译阶段,#define是在预处理阶段,当它出错时无法追踪
对于class类内的专属常量来说,要把它的作用域限制在类内(static const xxx)。而对于define来说,define不能定义任何class专属的常量,因为它没有scope的概念,也不提供任何封装性。
需要注意的是:类里的static const xxx是声明而非定义。声明时就可以给出初始化值了(新特性),定义时就不能再给初值。当然也可以选择声明时不给初值,定义时给初值。
enum:
对于类中的数组来说,要声明其长度,如果编译器不允许在编译时完成const int N, int a[N] 的设定,可用enum{xxx = x};
inline:
1. 用template + inline 代替 define定义的形似函数宏,不需要(像宏函数那样)为了防止边界效应,在函数本体中为形参加上括号。