默认构造函数
1.没有定义构造函数,编译器将自动定义默认构造函数,如果定义了构造函数,将不会定义默认构造函数,如果需要默认构造函数则需要自己添加。
2.如果是派生类并且数据成员中还有类的话,默认构造会调用基类和数据成员相关类的构造函数。
3.如果类包含指针对象。必须初始化指针。
复制构造函数
复制构造函数接受所属类的对象作为参数
有四种情况会调用复制构造函数:
1.用已有对象初始化新对象
2.按值将对象传递给函数
3.函数按值返回对象
4.编译器生成临时对象
在使用new初始化的成员函数通常要求执行深复制,或者类可能包含需要修改的静态变量,在这些情况下需要自己定义复制构造函数来满足要求。
赋值运算符
默认的赋值运算符用于处理同类对象之间的赋值。
注意初始化是创建新的对象,而赋值是修改原有对象。
什么时候需要显示定义赋值运算符:
1.当需要深复制的时候
2.将一种类型赋值给另外一种类型
将一种类型赋值给另外一种类型还有一种方法就是,采用转换函数,将一个类型转换为另外一种类型,再进行同种对象间的赋值。
其他的类方法
1.构造寒素并不会被继承
2.一定要定义显示的析构函数去清理构造函数中用new开辟的内存。基类析构函数一定要设置为虚析构函数。
3.一个构造函数可以充当转换函数。例如
Star (const char*);//一个参数的构造函数 Star (const Spectral &, int members = 1); Star north; north = "polaris";
如果不想要这种隐式转换,则需要将一个参数的构造函数用关键词explicit禁止隐式转换,但是还是允许显示转换。
4.将类对象转换为其他类型,应该定义转换函数。转换函数可以是没有参数的类成员函数,也可以是返回类型被声明为目标类型的类成员函数。即使没有声明返回类型,函数也应返回所需返回值。
5.按值传递对象与传递引用
常用引用来传递对象的原因有两种:
1.引用传递效率高
2.在继承使用虚函数时,被定义为接受基类引用参数的函数可以接受派生类。