1,当类中没有没有定义任何构造函数时,c++编译器提供默认无参构造函数和拷贝构造函数 |
2,当类中有任何非拷贝构造函数时,编译器不会提供无参构造函数 |
3,当类中有定义了拷贝构造函数时,编译器不会提供无参构造函数 |
构造函数初始化列表: class EE { public: //构造函数的初始化列表 //EE(int _a):d1(1),d2(2) EE(int _a):d2(1),d1(2) { a = _a; cout<<_a<<endl; } protected: private: int a; DD d1; //按照变量定义的顺序进行初始化,而和初始化列表写法无关 DD d2; }; /* 1 C++中提供了初始化列表对成员变量进行初始化 2 使用初始化列表出现原因: 1.必须这样做: 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数, 而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数, 如果没有初始化列表,那么他将无法完成第一步,就会报错。
2、类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值 当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化, 因为这两种const对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。 */ #include "iostream" using namespace std; class ABC { public: ABC(int a, int b, int c) { this->a = a; this->b = b; this->c = c; printf("a:%d,b:%d,c:%d \n", a, b, c); printf("ABC construct ..\n"); } ~ABC() { printf("a:%d,b:%d,c:%d \n", a, b, c); printf("~ABC() ..\n"); } protected: private: int a; int b; int c; }; class MyD { public: MyD():abc1(1,2,3),abc2(4,5,6),m(100) { cout<<"MyD()"<<endl; } ~MyD() { cout<<"~MyD()"<<endl; } protected: private: ABC abc1; //c++编译器不知道如何构造abc1,让ABC自己初始化 ABC abc2; const int m; }; |
|
class MyE { public: MyE():abcd1(1,2,3),abcd2(4,5,6),m(100) { cout<<"MyD()"<<endl; } ~MyE() { cout<<"~MyD()"<<endl; } MyE(const MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(100) { printf("MyD(const MyD & obj)\n"); }
protected: //private: public: ABCD abcd1; //c++编译器不知道如何构造abc1 ABCD abcd2; const int m;
}; 注意调用构造与析构的顺序 int doThing(MyE mye1) { printf("doThing() mye1.abc1.a:%d \n", mye1.abcd1.getA()); return 0; }
int run2() { MyE myE; //调用自己写的无参构造函数构造函数初始化实参 doThing(myE);//利用实参调用拷贝构造函数初始化形参 return 0; } |
临时对象:当直接调用构造函数而没有对象接收新对象,产生临时对象并立即析构 //ABCD abcd = ABCD(100, 200, 300); ABCD(400, 500, 600); //临时对象的生命周期 在构造函数中调用另一个构造函数初始化,并不能成功,因为另一个构造函数产生临时对象马上就会被析构 class MyTest { public: MyTest(int a, int b, int c) { this->a = a; this->b = b; this->c = c; } MyTest(int a, int b) { this->a = a; this->b = b; MyTest(a, b, 100); //直接构造析构 } ~MyTest() { printf("MyTest~:%d, %d, %d\n", a, b, c); } } |
C++构造函数调用规则
最新推荐文章于 2023-09-15 22:30:00 发布