1.构造函数不能被声明为const,当我们创建类的一个const对象时,知道构造函数完成初始化过程的时候,对象才真正的取得其“常量属性”。
2.如果我们没有显式的定义任何构造函数的话,那么编译器会为我们提供一个合成默认构造函数,当我们创建对象的时候,调用合成默认构造函数。默认构造函数无任何实参 如果我们显式的定义了一个默认构造函数,则当我们创建对象的时候,如果没有传递任何参数,那么调用默认构造函数。
3.合成默认构造函数初始化类的成员的规则: - 如果存在类内初始值,用它来初始化成员 - 如果没有类内初始值,则默认初始化成员
4.我们在定义类的时候,应当显式的声明默认函数,原因如下: - 只有当类中没有声明任何构造函数的时候,编译器才会提供合成默认构造函数 - 对于某些类来说,合成默认构造函数可能会执行错误的操作。如果定义在块中的内置类型或者复合类型(如数组、指针)的对象被合成默认初始化,则他们的值将是未定义的,该准则同样适用于默认初始化的内置类型成员,因此我们需要自己声明并定义一个默认构造函数,将所以成员的值赋一个初始值。 - 如果一个类的成员包含一个其它类类型的成员,那么编译器将无法进行合成默认初始化,这需要我们自己声明并定义一个默认构造函数。
代码示例:
#include<string>
class CStudent
{
public:
CStudent(){} = default;
CStudent(std::string name, int stu_num, int score):this->name(name), this->stu_num(stu_num), this->score(score){}
private:
std::string name;
int stu_num;
int score;
};
= default的含义
CStudent(){} = default;
因为该构造函数不接受任何实参,因此它是一个默认构造函数,我们希望它的功能和合成默认构造函数完全等同。 在C++11中,如果我们需要默认的行为,可以在参数列表后面写上= default来要求编译器生成默认构造函数。其中=default既可以和声明一起出现在类的内部,此时构造函数是内联的,也可以和定义一起出现在类的外部,此时构造函数不是内联的。
构造函数初始值列表
CStudent(std::string name, int stu_num, int score):this->name(name), this->stu_num(stu_num), this->score(score){}
在参数列表和花括号之间的这一部分称之为构造函数初始值列表,它负责为新创建的对象的一个或者几个数据成员赋初始值。构造函数初始值是成员名字的一个列表,每个名字后面紧跟着的小括号里面是成员初始值。
如果有类内初始值的话,构造函数最好使用类内初始值,因为这样能够确保你赋的值是一个正确的值。即构造函数不应该轻易的覆盖类内初始值,除非新赋的值与原来的值不同。
|