day04
2023年3月8日
知识点1.类的对象成员和初始化列表
1、初始化成员列表(参数列表)只能在构造函数中使用
语法::成员1(参数1),成员2(参数2),······
2、当调用构造函数时,先调用对象成员的构造函数,再调用本身的构造函数。析构函数和构造函数调用顺序相反,先构造,后析构。
#include <iostream>
using namespace std;
class A{
private:
int m_a;
public:
A(){cout << "A无参构造" << endl;}
A(int a)
{
m_a = a;
cout << "A有参构造" << endl;
}
~A(){cout << "A析构函数" << endl;}
};
class B{
private:
int m_b;
public:
B(){cout << "B无参构造" << endl;}
B(int b)
{
m_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):oba(a),obb(b)
{
data = c;
cout << "Data有参构造" << endl;
}
~Data(){cout << "Data析构函数" << endl;}
};
void test01()
{
//系统默认调用的是对象成员的无参构造
//必须在Data的有参构造函数中使用初始化列表,使其对象成员调用有参构造
Data d(10,20,30);
}
int main()
{
test01();
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/f8e0f42ce96d8e58530c99ed36f76e80.png)
知识点2.explicit关键字
C++提供关键字explicit主要用于禁止通过构造函数进行的隐式转换,声明为explicit的构造函数不能在隐式转换中使用,注意只针对单参数的构造函数而言。
#include <iostream>
using namespace std;
class Data{
private:
int Num;
public:
explicit Data(int num)
{
Num = num;
cout << "有参构造" << endl;
}
~Data(){cout << "析构函数" << endl;}
void showData()
{
cout << "Num = " << Num << endl;
}
};
int main()
{
//隐式转换
//Data ob1 = 10;//err,被explicit修饰的构造函数不允许隐式转换
//隐式调用
Data ob2(20);//ok
ob2.showData();
//显式调用
Data ob3 = Data(30);//ok
ob3.showData();
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/62ed57d9f7bcebacbbe9568260331684.png)