#include <iostream>
#include <string>
using namespace std;
class Phone {
public:
string m_pname;
/*Phone() {
cout << "无参构造" << endl;
m_pname = "vivo";
}*/
Phone(const Phone &p) {
cout << "拷贝构造" << endl;
m_pname = p.m_pname;
}
Phone(string pname) {
cout << "有参构造" << endl;
m_pname = pname;
}
};
//Phone p1;
class Person {
public:
string m_name;
Phone m_phone = {"s"};
Person(){
/*m_phone = Phone("ss")*/;
}
};
//class Person {
//public:
// string m_name;
// Phone m_phone;
// Person():m_phone("ss") {
// /*m_phone = Phone("ss")*/;
// }
//};
//class Person {
//public:
// string m_name;
// Phone m_phone;
// Person() : m_phone(p1) {
//
// }
//};
int main()
{
Person p;
return 0;
}
- Person对象构造之前,先将Person类的成员对象构造出来,也就是说 正式执行 Person 构造函数体 { } 之前, Person类的成员对象就要构造出来,
Phone m_phone; 这句话就要求必须有无参构造函数, 否则无法创建m_phone这个对象, 如果确实没有无参构造,那么在Person类的初始化列表里面指定构造方式也可以。 这就是所谓的 没有无参构造的成员对象要放在初始化列表里面执行,
这句话其实是片面的。比如 Phone m_phone = {“s”}; 这样写的话,就算没有无参构造,也可以不用再初始化列表初始化了。