将同一个对象传递给构造函数时,为什么要得到一个对象的副本?

时间:2019-04-15 00:20:27

标签: c++ constructor

我想弄清楚这里发生了什么。当将对象传递给需要字符串参数的构造函数时,为什么得到对象的副本?这是我的代码,仅供说明:

#include <iostream>

using namespace std;

class Person
{
public:
    Person( string name ):itsName(name){}

    /*operator std::string()
    {
        return itsName;
    }*/

    void SetName( string name )
    {
        itsName = name;
    }

    string GetName()
    {
        return itsName;
    }

private:
    string itsName;
};

int main()
{
    Person p1( "Lois" );
    Person p2( p1 );

    cout << p1.GetName() << endl;
    cout << p2.GetName();
    return 0;
}

谁能看到与P1相同的p2名称?当然,这很直观,但是我的Person构造函数中没有设置任何对象作为参数。它应该期望一个字符串。我确实评论了重载的字符串运算符,在这里看起来像“坏家伙”,但事实并非如此。该代码使用MinGW(gcc)在Code :: Blocks上编译。

2 个答案:

答案 0 :(得分:1)

原因是因为编译器会生成默认的副本构造函数。参见copy constructor。 如果您不喜欢默认行为,则可以将其明确删除。

 Person(const Person& ) = delete;

答案 1 :(得分:1)

正如@Sam Varshavchik在他的评论中所说,您正在使用复制构造函数。在所有成员变量也都具有复制构造函数的情况下,将为您创建的每个结构,类或联合隐式定义该变量!

它的作用是引用参数中的对象,并通过调用对象中所有成员变量的副本构造函数来创建副本,以创建深层副本。

如果我没记错的话,默认构造函数也以类似的方式隐式定义。

cppreference on the subject