今天在学C++时候,看到“其他类对象作本类的成员时候的构造函数调用顺序”的问题,
#include <iostream>
using namespace std;
#include <string>
class phone //-----------类phone
{
public:
phone()//默认构造函数
{
pname = "HuaWei";
}
phone (const phone &pn) :pname(pn.pname)// 拷贝构造函数
{
cout << "phone gouzao" << endl;
}
~phone()// 析构函数
{
//cout << "phone xigou" << endl;
}
string pname;
};
class person//--------类person
{
public:
person(string n, phone pn):name(n),p1(pn) // 有参构造函数
{
cout << "person gouzao" << endl;
}
~person()// 析构函数
{
//cout << "person xigou" << endl;
}
string name;
phone p1;
};
int main()
{
phone p; // 先定义phone对象p,主要用于p1传参
person p1("张三",p); // 传入“张三”字符串和phone对象p
}
我本以为的运行结果是先输出“phone gouzao”, 然后是“person gouzao”
而实际结果是
在我逐步运行后发现,在走到person p1("张三",p); 这一步的时候先调动phone的拷贝构造函数;到person类的有参构造函数中又调用了phone的拷贝构造函数。
在这里我很迷惑
求解!谢谢大家!
因为构造函数person(string n, phone pn)
的参数是传值的,所有在构造形参pn时,又调用了一次拷贝构造函数。如果你改为const phone&
,那么形参就不会调用拷贝构造函数。
在p作为参数传递给person构造函数的时候,在函数内部是会对变量隐式创建一个同名的临时变量的,所以这里p这个phone类对象会默认调用拷贝构造函数来进行变量复制,因此会先输出phone gouzao的