构造函数在实例化对象的时候会自动调用函数,与类名保持一致即可,默认构造函数是系统自动生成,有几点需要注意:
pointer();//没写构造函数一般会自动生成,有几种情况不会自动生成,在后面说
pointer p;//会直接调用默认构造函数
pointer *p = new pointer();//如上
pointer *p = new pointer;//如上
pointer p(5,6);
pointer *p = new pointer(5,6);//会找相应的构造函数
初始化列表
pointer :: pointer(int _x , int _y) : x(_x) , y(_y)
{
cout << "调用初始化列表的构造函数" << endl;
}、
数组进行初始化的时候
int *arr = new int[5]{1,2,3,4,5} //这个是c++11的语法
只有构造函数被需要的时候才会生成构造函数(拷贝构造函数也是),在没有显示定义构造函数的时候,编译器不一定会生成默认的构造函数
第一种,在类当中有其他类的数据成员,在实例化对象的时候会调用另外一个对象的构造函数,例如:
class A
{
A(){
cout << "调用A的构造函数" << endl;
}
}
class B
{
public:
A a;//实例化B的时候会调用A的构造函数
}
第二种,基类带有构造函数的派生类
class A
{
A(){
cout << "调用A的构造函数" << endl;
}
}
class B : class A
{
int b;
}
当实例化B的时候就可以调用A的构造函数
第三种,带有虚函数的类
这种情况有两种情况:1.类本身自己定义了自己的虚函数 2.类从继承体系中继承了虚函数(成员函数一旦被声明为虚函数,继承不会改变虚函数的”虚性质")
这两种情况都使一个类成为带有虚函数的类。这样的类也满足编译器需要合成默认构造函数的类,原因是含有虚函数的类对象都含有一个虚表指针vptr,编译器需要对vptr设置初值以满足虚函数机制的正确运行,编译器会把这个设置初值的操作放在默认构造函数中。
如果设计者没有定义任何一个默认构造函数,则编译器会合成一个默认构造函数完成上述操作,否则,编译器将在每一个构造函数中插入代码来完成相同的事情
第四种,虚拟继承下
虚继承也会在子类对象中被合成一个指向虚基类的指针,因此也要被初始化,所以必须要构造函数,虚基类或者虚继承保证子类对象中只有一份虚基类的对象。
不符合以上四种情况,没有声明构造函数的,编辑器不会默认生成构造函数。
并且合成的构造函数并不会初始化内置类型复合类型的数据成员