C++构造函数调用规则

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++中提供了初始化列表对成员变量进行初始化

使用初始化列表出现原因

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值