侯捷C++系列(1)
本文最后更新于:2021年10月25日 下午
1.inline内联函数
1.inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。
2.inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。
3.inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,得看编译器,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
4.定义在类中的成员函数缺省都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的。
2.构造函数初始化
成员变量再构造函数中初始化中使用”:”函数方式性能比直接在构造函数中赋值要快,建议使用这种方式。
why?
- 初始化一个类时,调用构造函数首先执行初始化列表,再执行构造函数函数体内的语句。
- 在执行到构造函数函数体内的语句时,变量已经初始化(可能值未定义),产生了消耗。而且const类型的变量只有初始化时可以赋值,在函数体内无法赋值。
3.构造函数重载注意事项
黄色标注的构造函数定义将出现问题,如果该函数与上面构造函数同时出现,在无参初始化该类对象时将产生冲突,因为第一个构造函数已经有参数默认初始化列表了,定义该类对象时可以不加入参数,这就产生了冲突。
4.常量成员函数
在一个类中,如果成员函数中没有改变成员函数操作(例如get操作),那么建议在该方法声明处加入const关键字,如果不加入const关键字,那么c++编译器将认为该函数可能会修改类的成员变量。这样做有个好处,如果使用者利用了const关键字定义并通过构造函数初始化了一个complex类,这个类将不能被修改,只能读取属性。当使用者调用complex的real()或者imag()方法时,如果这两个方法在定义处没有加入const关键字,那么将报错。
总结来说,成员函数用const修饰this指针,const关键字显式的告诉编译器无法改变修饰的对象,帮助检查出错。
5.参数传递和返回值使用const引用
函数参数传递,如果不需要改变参数值,建议使用const reference减小开销。
下图之中ostream会改变,不能用const传参,返回值也不能加上const。
返回值建议使用引用,但如果返回引用的是该函数的一个指向堆局部变量指针,例如*ptr,那么不能使用引用,因为该局部变量在函数调用后就以及销毁了,引用可以认为是给当前对象换了个别名,如果当前对象已经被销毁,那么该“别名”也就失去了意义,不存在了。
当然,如下图所示,对于临时变量也不能返回引用:
6.友元
相同类的各个实例对象互为友元,可以通过彼此的内部方法调用传入参数的内部私有成员变量。
7.运算符重载this指针
如上图所所示,在运算符重载过程中隐藏了this指针,该指针编译器会处理,使用者不能显式声明。
所有双目运算符都是这样。
8.拷贝赋值函数
如上图所示,在重载“=”赋值运算符时需要检查自我赋值,原因如下:
如果没有自我赋值检测,那么自身对象的m_data将被释放,m_data指向的内容将不存在,所以该拷贝会出问题。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!