构造函数
1)函数名与类名相同,且没有返回类型。
2)构造函数在对象被创建时自动被调用。
3)构造函数负责确定对象的初始状态以及分配必要的资源。
4)构造函数在每个对象的整个生命周期内,一定会被调用,且仅被调用一次
对象的创建过程:
A.首先为对象分配足量的内存空间;
B.以构造实参调用构造函数,完成如下任务:
a)依次调用各个基类的构造函数,初始化所有基类子对象;
b)依次调用类类型成员的构造函数,初始化所有成员子对象;
c)执行构造函数体代码。
默认构造函数
如果一个类中不存在默认构造函数,那么它会在被编译器需要的时候由编译器生成,且该默认构造函数只能满足编译器所需的行为。
如果一个类没有默认构造函数且类中含有带有显示默认构造函数的成员子对象
该类被编译器生成的默认构造函数是nontrivial constructor
如下:
class Foo{
public:
Foo();
Foo(int);
...
};
class Bar{
public:
Foo foo;
char* str;
}
int main(int){
Bar b; //在需要的时候编译器为Bear类生成一个默认构造函数
if(b.str){
...}
return 0;
}
在上面的代码中。将b.foo对象初始化是编译器的责任(编译器所需的行为),而将b.str初始化是程序的需要(编译器不管),则为其生成的默认构造函数为
inline Bar::Bar(){
//伪代码
foo.Foo::Foo();
}