在特殊情况下,如何调用复制构造函数?

时间:2018-03-24 06:07:27

标签: c++ class copy-constructor

我在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}}已初始化。

是否有一些编译器优化或我的意见是错误的?  我找了很久。但没用。请帮助或尝试提供一些如何实现这一点的想法。提前致谢。

0 个答案:

没有答案