我想弄清楚这里发生了什么。当将对象传递给需要字符串参数的构造函数时,为什么得到对象的副本?这是我的代码,仅供说明:
#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上编译。
答案 0 :(得分:1)
原因是因为编译器会生成默认的副本构造函数。参见copy constructor。 如果您不喜欢默认行为,则可以将其明确删除。
Person(const Person& ) = delete;
答案 1 :(得分:1)
正如@Sam Varshavchik在他的评论中所说,您正在使用复制构造函数。在所有成员变量也都具有复制构造函数的情况下,将为您创建的每个结构,类或联合隐式定义该变量!
它的作用是引用参数中的对象,并通过调用对象中所有成员变量的副本构造函数来创建副本,以创建深层副本。
如果我没记错的话,默认构造函数也以类似的方式隐式定义。