1、构造函数
不要在构造函数中进行复杂的初始化 (尤其是那些有可能失败或者需要调用虚函数的初始化).
构造函数不得调用虚函数, 或尝试报告一个非致命错误. 如果对象需要进行有意义的 初始化, 考虑使用明确的 Init() 方法或使用工厂模式.
2、初始化
第一种方法:构造函数内部初始化
MYClass::MYClass() { x=0; y=1; }
第二种方法: 使用成员初始化列表,推荐用第二种
MYClass::MYClass() : x(0), y(1) { }
3、显式构造函数
所有单参数构造函数都必须是显式的. 在类定义中, 将关键字 explicit
加到单参数构造函数前,避免不合时宜的隐式变换
如:explicit Foo(string name);
4、拷贝构造函数
如果对象是唯一的,比如Qt的QObject及其继承类的对象,都代表着唯一,不能赋值,需要将拷贝构造函数设置成私有的private,或用“=delete”来初始化。
5、移动构造函数
什么是移动构造函数?下面的博客讲的比较清除
https://blog.csdn.net/u010087886/article/details/51037890
https://www.zhihu.com/question/22111546
6、委派和继承构造函数
只在能够减少冗余代码, 提高可读性的前提下使用委派和继承构造函数. 如果
派生类有新的成员变量, 那么使用继承构造函数时要小心. 如果在派生类中对成员
变量使用了类内部初始化的话, 继承构造函数还是适用的.
7、struct和class
成员只有数据,并且是通过位域(.或->)来存取成员时,使用struct;
stuct中可以定义构造函数, 析构函数, Initialize(), Reset(), Validate() 等类似的函数;
其它一概使用 class;
8、继承
所有继承必须是 public
的. 如果你想使用私有继承, 你应该替换成把基类的实例作为成员对象的方式(使用组合设计模式);
只有当 子类 “is-a” 父类时,才使用继承,“has-a” 情况下请使用组合;
如果类有虚函数, 则析构函数也应该为虚函数;
9、多重继承
真正需要用到多重实现继承的情况少之又少. 只在以下情况我们才允许多重继承: 最多只有一个基类是非抽象类; 其它基类都是接口类(纯虚类);
接口类应该是只提供方法声明,而自身不提供方法定义的抽象类。接口类自身不能实例化,接口类的方法定义/实现只能由接口类的子类来完成;
10、运算符重载
一般不要重载运算符. 尤其是赋值操作 (operator=
) 比较诡异, 应避免重载。
可以在声明容器的时候, 创建相等判断和大小比较的仿函数
类型