|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 moc 于 2018-8-31 23:12 编辑
1、C++编译器提供构造函数规则
1. 当一个类中没有定义任何的构造函数时,C++编译器会自动为我们提供无参和拷贝构造函数;
2.当类中定义了有参或是拷贝构造函数,C++编译器便不会再提供无参构造函数
3.C++编译器提供的拷贝构造函数,是浅拷贝的方式。
2、构造函数初始化列表
C++中提供了初始化列表对类成员变量进行初始化
使用初始化列表出现原因:
1.必须这样做:
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,
而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,
如果没有初始化列表,那么他将无法完成第一步,就会报错。
2.类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值
当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,
因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。
注意:类里变量的初始化顺序根据变量的定义顺序,而不是初始化列表的顺序。
拷贝构造函数也可以带初始化列表。
- class DD
- {
- public:
- DD(int d) //DD中定义了有参构造函数
- {
- cout<<d<<endl;
- m_d = d;
- }
- private:
- int m_d;
- };
- class EE
- {
- public:
- //构造函数的初始化列表, d1(),d2()里的参数可以通过EE()中传过来
- EE(int _a):d2(1),d1(_a)
- {
- a = _a;
- cout<<_a<<endl;
- }
- protected:
- private:
- int a;
- DD d1; //按照变量定义的顺序
- DD d2;
- };
- void main()
- {
- EE e1(3); // 先调用EE的构造函数,初始化属性a,在去调用DD的构造函数初始化d1,最后初始化d2
- system("pause");
- }
复制代码
上面未为变量搭建舞台,正常退出时,先析构d2,在析构d1,最后析构e1,先创建的后析构
3、临时匿名对象
可以在程序中直接调用构造函数,这是会创建一个临时匿名对象。
- ABCD(400, 500, 600); //直接调用类的构造函数,会创建一个临时匿名对象,先调用它的有参构造函数,然后发现没人接受他,他马上又会执行析构函数。
- ABCD abcd = ABCD(100, 200, 300); // 这回有人接这个,直接把这个临时匿名对象给abcd, abcd也不用从新申请内存空间啦,也就是有参构造的第三种方式
- ABCD abc;
- abc = ABCD(1, 2, 4); //这样也是可以的,创建临时对象,临时对象给别的对象赋值,然后临时对象再析构
复制代码
注意:在构造函数中调用构造函数
构造函数中是不能调用构造函数的,它只会创建临时对象,而且马上又会被析构。
|
|