我有以下代码:
class TestClass
{
public:
TestClass(){};
std::string GetTestString()
{
return (mTestString);
}
void SetTestString(const std::string& rTestString)
{
mTestString = rTestString;
}
private:
std::string mTestString;
};
TestClass* pGlobalVar;
void SomeFunction(TestClass MyClass)
{
pGlobalVar->SetTestString("cba");
std::cout << "Changed string: " << pGlobalVar->GetTestString() << std::endl;
std::cout << "Copied string: " << MyClass.GetTestString() << std::endl;
}
int main()
{
pGlobalVar = new TestClass();
pGlobalVar->SetTestString("abc");
std::cout << "Original string: " << pGlobalVar->GetTestString() << std::endl;
SomeFunction(*pGlobalVar);
delete (pGlobalVar);
}
这输出以下内容:
Original string: abc Changed string: cba Copied string: abc
由于我没有为我的类定义一个复制构造函数,我希望可以制作一个平面副本,包括std::string
中的指针。显然虽然使用了std::string
复制构造函数,但由于对原始字符串的更改未更改副本。
有人可以向我解释为什么它没有制作平面副本吗?
我正在使用Linux和GCC 4.4.6。
答案 0 :(得分:5)
由于我没有为我的班级定义一个复制构造函数,我希望可以制作一个平面副本
由于您没有定义复制构造函数,C ++为您做了。
自动生成的复制构造函数为其所有成员变量调用构造函数(如果有的话)。
类似地,自动生成的构造函数调用其所有成员的构造函数,析构函数调用其所有成员的析构函数。
答案 1 :(得分:5)
由于我没有为我的类定义一个拷贝构造函数,我希望可以制作一个平面拷贝,包括std :: string中的指针。
不,隐式生成的复制构造函数将使用其复制构造函数(如果有)复制每个数据成员(和基础子对象)。
有人可以向我解释为什么它没有制作平面副本吗?
因为那将会被严重打破。类定义了一个复制构造函数,因为它必须以某种方式复制;在std::string
的情况下,它必须创建一个新的缓冲区。如果新字符串只是保存了另一个指针的副本,那么两者都会认为它们拥有相同的缓冲区,并且两者都会在它们被销毁时尝试解除分配。