我在Visual Studio 2017中编写了一个类:
class Person
{
public:
Person() {cout << "construtor" << endl; };
Person(istream&a);
Person(const Person&a) :name(a.name), address(a.address) { cout << "copy construtor" << endl; }
~Person() { cout << "destructor" << endl; };
private:
string name;
string address;
}
Person::Person(istream&a)
{
a >> name >> address;
cout << "call fuction" << endl;
}
int main()
{
Person a =Person(cin);
return 0;
}
在我看来,我认为Person(cin)
可能会创建一个临时对象;它会调用函数Person(istream&a)
;然后由复制构造器创建a
。
所以如果我输入Jack CN
:
Jack CN
call fuction
copy constructor
destructor
destructor
但实际结果令人惊讶:
Jack CN
call fuction
destructor
我已经看到复制初始化发生在
使用=
在C ++ primer中定义变量。为什么没有在这里发生。我在网上搜索了很长时间。有人跟我说Person a =Person(cin);
等于Person a(cin)
;当我调试时,他们得到了相同的结果。
但我想到了一种方法。我试图将Person(const Person&a) :name(a.name), address(a.address) { cout << "copy construtor" << endl; }
放入private:
。
一个惊人的事情发生了。Person a(cin)
的版本成功编译并运行。Person a =Person(cin);
的版本没有编译; Person::Person(const Person&a) is Inaccessible
。所以如果Person a =Person(cin);
等于Person a(cin)
在这里。为什么Person a =Person(cin);
无法编译。如果Person a =Person(cin);
没有调用复制construtor。为什么当我把它放入private:
时,它就出错了。所以我想知道如何{{ <{1}}中的1}}已初始化。
是否有一些编译器优化或我的意见是错误的? 我找了很久。但没用。请帮助或尝试提供一些如何实现这一点的想法。提前致谢。