C++ 有参构造 无参构造 拷贝构造 以及参数化列表 成员对象之间的执行关系

#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;
}

  1. Person对象构造之前,先将Person类的成员对象构造出来,也就是说 正式执行 Person 构造函数体 { } 之前, Person类的成员对象就要构造出来,
    Phone m_phone; 这句话就要求必须有无参构造函数, 否则无法创建m_phone这个对象, 如果确实没有无参构造,那么在Person类的初始化列表里面指定构造方式也可以。 这就是所谓的 没有无参构造的成员对象要放在初始化列表里面执行,
    这句话其实是片面的。比如 Phone m_phone = {“s”}; 这样写的话,就算没有无参构造,也可以不用再初始化列表初始化了。
发布了100 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43903378/article/details/103840232