C++ primer 要点总结

来源:互联网 发布:关系型数据库有哪些 编辑:程序博客网 时间:2024/05/21 17:00
1. private和protected类型的数据成员或成员函数,不能被对象直接引用。包括构造函数
2. static成员函数只能操作static数据成员,它没有this指针
3. static数据成员在类内声明,但必须在类外定义并且初始化,且定义不能标示为static。
4. 单参的构造函数可以视为到该类类型的隐式转换,一个好的习惯是用explicit关键字来阻止这种隐式转换,并在需要转换时显式调用构造函数
5. 如果定义了一个构造函数,则不会再生成合成的默认构造函数。好的习惯是自己定义默认构造函数,以防止以后使用不方便。无参的构造函数和有默认实参的构造函数都是默认构造函数。(如果两者都定义会引起二义性)
6. 任何const数据成员、引用类型数据成员和没有默认构造函数的类类型成员都必须用初始化式来进行初始化,因为它们不支持赋值。
7. 构造函数分两个阶段执行,初始化阶段和普通的计算阶段。不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段之前。
8. 基于成员函数是否为const可以重载一个成员函数。同样,基于一个指针形参是否指向const(注意不是const类型指针)可以重载一个成员函数。const对象只能使用const成员。
9. this指针是一个指向类类型的const指针。
10. 只有单个形参,且该形参是对本类类型对象的引用,这样的构造函数称为复制构造函数。
11. 对于类类型对象,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。对于类类型,只有指定单个实参或显式创建一个临时对象用于复制时,才使用复制初始化。
12. 复制控制,通常包括复制构造函数,赋值操作符和析构函数。通常它们会自动合成,如果其中有一个需要自定义则其他的也需要自定义。需要自定义的情况一般是类中有数据成员是指针或引用类型。
13. 当复制构造函数被private修饰时,禁止复制。
14. 在操作符重载中,对函数调用操作符()的重载比较特殊。定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。其优点参考C++ primer P450(函数对象常用作通用算法的实参)
15. 转换操作符是一种特殊的类成员函数也是特殊的重载,它定义将类类型值转变为其他类型值的转换。operator+目标类型,必须为成员函数且不能有返回值。一般而言,不允许转换为数组或函数类型,转换为指针类型及引用类型是可以的。
16. 注意,只能应用一次类类型转换
17. 当有多个重载函数存在时,如何进行参数匹配是一个问题,当有2个以上的函数匹配优先级一样的时候,会产生二义性。
18. 当两个类定义了相互转换时,可能存在二义性。要避免编写互相提供隐式转换的成对的类。避免二义性最好的方法是,保证最多只有一种途径将一个类型转换为另一类型。做到这一点,最好的办法是限制转换操作符的数目。
19. 继承层次的根类一般都要定义虚析构函数。
20. 接口继承与实现继承,public派生类继承基类的接口,它具有与基类相同的接口。设计良好的类层次中,public派生类的对象可以用在任何需要基类对象的地方。使用private或protected派生的类不继承基类的接口,相反,这些派生通常被称为实现继承。
21. static const型变量需要在类中初始化,但不需要在初始化列表中初始化。
22. 尽量不在头文件中对命名空间进行using操作,以免命名空间污染。尽量在头文件中少包含头文件
23. 在switch语句内,在第一个case前面的语句将会被忽略。在case中可以进行变量声明等操作,但必须用大括号括起。
24. 虚继承的时候最底层的派生类构造函数需要负责初始化虚基类,无论虚基类出现在继承层次中的任何地方,总是在构造非虚基类之前构造虚基类
25. 尽量避免使用虚继承和菱形继承
26. 每一个non-inline member function只会诞生一个函数实体,而inline function则会在每一个使用者身上产生一个函数实体
27. C++在布局以及存取时间上主要的额外负担是由virtual引起的
28. 每一个class 产生出一堆指向相关的virtual functions的指针,放在表格之中。这个表格被称为virtual table(vtbl)。每一个class object被添加了一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定和重置都由一个class的构造函数,析构函数和复制操作符自动完成。每一个class所关联的type info object(类型信息,用以支持RTTI)也经由virtual table被指出来,通常是放在表格的第一个slot处。
29. C++中凡处于同一个access section的数据,必定保证以其声明次序出现在内存布局当中。然而被放置在多个access sections中的各笔数据,排列次序就不一定了。


原创粉丝点击