1、赋值初始化:通过在函数体内进行赋值初始化
2、列表初始化:在冒号后使用初始化列表进行初始化
1中实在构造函数当中做赋值操作,而2中是纯粹的初始化操作,赋值操作会产生临时对象的,降低程序的效率
赋值初始化操作:
class Person{
public:
Person(int a, int b, int c){
m_A = a;
m_B = b;
m_C = c;
}
int m_A;
int m_B;
int m_C;
};
int main(){
Person p(10, 20, 30);
cout<<"m_A的年龄为:"<<p.m_A<<endl;
cout<<"m_B的年龄为:"<<p.m_B<<endl;
cout<<"m_C的年龄为:"<<p.m_C<<endl;
return 0;
}
列表初始化操作:
class Person {
public:
Person(int a, int b, int c):m_A(a), m_B(b), m_C(c) {
}
int m_A;
int m_B;
int m_C;
};
int main() {
Person p(10, 20, 30);
cout << "m_A的年龄为:" << p.m_A << endl;
cout << "m_B的年龄为:" << p.m_B << endl;
cout << "m_C的年龄为:" << p.m_C << endl;
return 0;
}
上图为调用顺序
**********************************************分割线********************************************************
类对象作为类成员
B类中有对象A作为成员,A为对象成员
那么当创建B对象时,A与B的构造和析构的顺序谁先谁后?
class phone {
public:
phone(string pName) { //手机构造函数
cout << "phone的构造函数" << endl;
m_PName = pName;
}
string m_PName; //手机品牌名称
~phone() {
cout << "phone的析构函数" << endl;
}
};
class Person{
public:
Person(string name, string PName): m_Name(name), m_Phone(PName)
{
cout << "Person的构造函数" << endl;
}
//姓名
string m_Name;
//手机
phone m_Phone;
~Person() {
cout << "Person的构造函数" << endl;
}
};
int main() {
Person p("张三", "苹果MAX");
cout << p.m_Name << "拿着" <<p.m_Phone.m_PName<< endl;
return 0;
}
先对象成员的构造函数,再类的构造函数。析构函数相反