《Effective C++》学习笔记

1 让自己习惯C++

01 视c++为一个语言联邦

c++由四个次语言组成:C, Objective-oriented c++, Template c++, STL

02 尽量以const, enum, inline替换 #define

减轻预处理器的的工作
未完

03 尽可能使用const

常量指针和指针常量

常量指针:const int * a 指的对象值不变,是常量
指针常量:int *const a 指针本身地址是常量,值可以变
对与container::iterator,前面加const,相当于指针常量,不能it++;想用常量指针要用container::const_iterator关键字

函数返回值,参数,成员函数

返回值前加const是为了保证返回的值不再被修改(一不小心)
举例:

Rational a, b, c;
...
(a * b) = c; // 在a*b的结果上调用operator=,这肯定是我们不期望的行为,加上const就可以避免结果被修改

const成员函数:使得该成员函数能够被const对象调用,const对象不能调用非const成员函数

04 确定对象被使用前已先被初始化

对于构造函数:总是使用成员初值列,并且最好以其声明次序来初始化
对于non-local static对象:当你跨编译单元(跨文件)调用函数时,如果你调用的对象还没初始化,就会出事,主要原因是C++不知道不同编译单元的初始化顺序。解决方案:将non-local static 转化为local static对象,具体做法为,使用一个reference-returning函数返回该static变量的引用,这样能保证调用之前一定初始化了。从以前的tfs.numDisks()变成了tfs().numDisks()。

2 构造/析构/赋值运算

05 了解C++默默编写并调用哪些函数

编译器会自动构造default构造函数,复制构造函数,=operator以及析构函数
最好自己来定义

06 若不想使用编译器自动生成的函数,就应该明确拒绝

为驳回编译器自动提供的函数,可以主动将对应的函数声明为private并且不予实现。一种方法,定义一个Uncopyable,在这个类中实现上述操作,然后原来的类继承自这个Uncopyable,这是为了避免private被其他的成员函数或者友元函数不小心调用了。

07 为多态基类声明virtual析构函数

20 宁以pass-by-reference-to-const替换pass-by-value

采用const引用传参(尤其是class),可以避免class的copy,节省构造和析构的开销,const是为了保证原数据不被修改。同时还可以避免切割问题(slicing problem)
切割问题:如果采用值传参,参数是父类,传的是子类,会被解析成父类,子类的重载函数也会执行父类的原函数,子类的特性被切割了。采用const引用传参,传的是啥就是啥,不会被切割。
但是对于内置类型(c++自带的int啥的)和STL的迭代器和函数对象,往往pass-by-value更有效

比较好的参考链接:
https://blog.csdn.net/qq_43763344/article/details/95447843
https://normaluhr.github.io/2020/12/31/Effective-C++/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值