目录
1、什么是初始化列表?
注意:初始化列表只能在构造函数中使用 ,并且初始化列表按照成员变量在类中的声明次序进行初始化。
代码示例:
class Number {
private:
int m_a;
int m_b;
int m_c;
public:
Number(int a,int b,int c):m_a(a),m_b(b),m_c(c)
{
//this->a = a;
//this->b = b;
//this->c = c;
}
void show() {
cout <<m_a << " " << m_b << " " << m_c << endl;
}
~Number() {
cout << "析构函数" << endl;
}
};
void Init() {
Number n(10, 20, 30);
n.show();
}
int main() {
Init();
}
运行结果:
2、对象成员
C++类中的成员可以是另一个类的对象,我们称该成员为对象成员
2.1、无参构造的调用
调用流程:先调用对象成员的构造--》自己的构造函数--》先析构自己--》析构对象成员
代码示例:
class A {
private:
int a;
public:
A() {
cout << "A无参构造" << endl;
}
~A() {
cout << "A析构函数" << endl;
}
};
class B {
private:
int b;
public:
B() {
cout << "B无参构造" << endl;
}
~B() {
cout << "B析构函数" << endl;
}
};
class Data {
private:
A oba;
B obb;
int data;
public:
Data() {
cout << "Data无参构造" << endl;
}
~Data() {
cout << "Data析构函数" << endl;
}
};
void Init() {
Data d;
}
int main() {
Init();
}
运行结果:
系统默认调用的是对象成员的无参构造
2.2、有参构造的调用
先看一个示例:
class A {
private:
int a;
public:
A() {
cout << "A无参构造" << endl;
}
A(int a) {
this.a = a;
cout << "A有无参构造" << endl;
}
~A() {
cout << "A析构函数" << endl;
}
};
class B {
private:
int b;
public:
B() {
cout << "B无参构造" << endl;
}
B(int b) {
this.b = b;
cout << "B有无参构造" << endl;
}
~B() {
cout << "B析构函数" << endl;
}
};
class Data {
private:
A oba;
B obb;
int data;
public:
Data() {
cout << "Data无参构造" << endl;
}
Data(int a,int b,int c) {
data = c;
cout << "Data有参构造" << endl;
}
~Data() {
cout << "Data析构函数" << endl;
}
};
void Init() {
Data d(10, 20, 30);
}
int main() {
Init();
}
运行结果:
在上述代码中发现,只给给Data中的成员赋值后,系统只调用了Data中的有参构造,而对象成员调用的还是无参构造, 如果我们想调用对象成员的有参构造,该怎么实现呢?
3、初始化列表的使用
先看一个示例:
如果通过上面代码去给类对象成员中的成员赋值,这显然是行不通的,因为在类对象里这些成员是私有的,这时候该怎么做呢?
这时候可以通过初始化列表完成上述操作
代码示例:
class Data {
private:
A oba;
B obb;
int data;
public:
Data(int a,int b,int c):oba(a),obb(b),data(c)
{
//data = c;
cout << "Data有参构造" << endl;
}
Data() {
cout << "Data无参构造" << endl;
}
~Data() {
cout << "Data析构函数" << endl;
}
};
运行结果:
初始化列表解决了对象成员调用有参构造无法传参问题。