1.复制控制。编译器会自动生成,但是也可以自定义实现。
![]()
2.由于不能复制IO类型的对象,所以不能对那些类型的对象使用复制初始化
3.发生隐式转换,除非有心利用,隐式转换常常带来程序逻辑的错误,而且这种错误一旦发生是很难察觉的。
原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。
4.为了防止复制,类必须显示声明其复制构造函数为private
5.动态使用的对象只有指向该对象的指针被删除时才会撤销
6.析构函数、合成析构函数
7.智能指针、悬空指针
8.定义智能指针的通用技术是采用一个使用计数
9.重载操作符必须具有至少一个类类型或枚举类型的操作数。
10.不能复制ostream对象
11.输入操作符必须处理错误和文件结束的情形
12.标准库函数greater<string>(),将大于操作符应用于两个string对象上
13.语言只允许一次类类型转换
14.保留字virtual的作用的启用动态绑定
15.类可以访问基类的public和protected成员
16.引用和指针的静态类型和动态类型可以不同
17.覆盖虚函数。
18.dynamic_cast可以将基类类型转换为派生类类型。
19.一个类只能初始化它的直接基类
20.重构
21.尊重基类接口
22.赋值操作符必须防止自身赋值
23.首先析构派生类,然后逐层析构基类。按照构造函数的逆序撤销对象。
24.析构函数的虚函数
25.将类的赋值操作符设为虚函数没有什么用
26.静态类型和动态类型
27.使用作用域操作符来调用被屏蔽对象
28.using声明
29.纯虚函数
30.指针和引用会增加类用户的负担
31.句柄类 保存使用类的指针和使用计数
32.派生类中的成员函数不重载基类成员
33.模板是泛型编程的基础
34.template <typename
T>
35.inline放在template之后,函数返回值之前
36.template <class type>定义类模板。typename和class是一样的,但typename新加入的,旧的程序可能只支持class
37.实例化
38.long val3 = sum<long>(i, lng);
39.模板类使用时必须初始化
39.模板类使用时必须初始化
40.函数模板的特化。特化版本
41.类模板的特化,也可以特化其中的成员函数,而不是特化整个类。
42.当匹配同样好时,非模板版本优先。
43.异常处理,命名空间,多重继承
44.抛出指针通常是一个坏主意。
45.析构函数一般不会发生异常。
46.最特殊的异常应该最先出现。基类的异常说明符可以捕获派生类的异常说明。
47.对象调用不进行动态绑定。只有通过引用或指针调用时才发生动态绑定。
48.throw空语句重新抛出。它只能出现在catch语句或者catch调用的函数中。
49.catch(...)捕获所有的异常语句
50.try块
51.使用类来管理和分配资源使得在构造对象时分配资源,在异常抛出时也能够调用析构函数释放资源。
52.auto_ptr 中的get()方法返回对象或使用返回的指针值
53.命名空间污染
54.一个命名空间是一个作用域
55.命名空间内的成员函数既可以在命名空间内定义,也可以在命名空间外定义,但是不能够在其他的命名空间内定义。
56.全局命名空间用::成员函数 来访问。
57.命名空间别名
58.using指示应该避免使用,使用using声明
59.如果函数具有类类型形参就使得函数可见
60.没有办法编写using声明来引用特定的函数
61.多重继承
62.虚基类。虚基类在任何其他基类之前构造
63.重新分配delete
64.定位new表达式
65.dynamic_cast
66.typeid
67.typeinfo类
68.嵌套类
69.联合。union不能包括具有构造函数、析构函数、赋值操作符的类。
70.局部类、嵌套的局部类
71.位域
72.volatile
73.extern "C" 链接
74.标准库定义了100多个算法