1 C++中提供了初始化列表对成员变量进行初始化
2 使用初始化列表出现原因:
2.1 .必须这样做:
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,
而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,
如果没有初始化列表,那么他将无法完成第一步,就会报错。
3、类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值
当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,
因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
using namespace std;
class Test1{
public:
Test1(int a)
{
this->m_a = a;
cout<<"有参构造函数Test1"<<endl;
}
~Test1()
{
cout<<"析构造函数Test1"<<this->m_a<<endl;
}
public:
private:
int m_a;
};
class Test2{
public:
//C++中提供初始化列表对成员变量进行初始化
//Test2中组合了Test1的对象,并且Test1的对象 有构造函数
//Test1有了构造函数必须使用,就出现构造函数的初始化列表
Test2(int a,int b):t1(1),t2(2),c(0)
{
this->m_a = a;
this->m_b = b;
cout<<"有参构造函数1"<<endl;
}
Test2(int a,int b,int m ,int n):t1(m),t2(n),c(0)
{
this->m_a = a;
this->m_b = b;
cout<<"有参构造函数2"<<endl;
}
~Test2()
{
cout<<"析构造函数Test2 "<<this->m_a<<" "<<this->m_b<<endl;
}
private:
int m_a;
int m_b;
Test1 t1;
Test1 t2;
const int c;//用const属性必须要用初始化列表初始化
};
void objplaymain(){
//Test1 t1(10);
//参数传递
//Test2 obj1(5,6);
//(1)先执行被组合对象的构造函数,组合对象有多个 按照定义的顺序去调用,不是按照初始化列表的顺序
//(2)析构函数的调用顺序和构造函数相反
Test2 obj2(5,6,7,8);
}
int main()
{
objplaymain();
cout<<"hello...."<<endl;
system("pause");
return 0;
}