2

我有以下代码:

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);
}

这将输出以下内容:

原始字符串:abc
更改字符串:cba
复制字符串:abc

由于我没有为我的类定义复制构造函数,我希望会制作一个平面副本,包括std::string. 显然,虽然使用了std::string复制构造函数,因为对原始字符串的更改并没有更改副本。

谁能向我解释为什么它没有制作平面副本?

我正在使用带有 GCC 4.4.6 的 Linux。

4

2 回答 2

5

由于我没有为我的类定义复制构造函数,我希望会制作一个平面副本

由于您没有定义复制构造函数,因此 C++ 为您做了。

自动生成的复制构造函数调用其所有成员变量(如果有的话)的构造函数。

类似地,自动生成的构造函数调用其所有成员的构造函数,而析构函数调用其所有成员的析构函数。

于 2012-07-25T08:45:08.280 回答
5

由于我没有为我的类定义复制构造函数,因此我希望制作一个平面副本,包括 std::string 中的指针。

不,隐式生成的复制构造函数将使用其复制构造函数复制每个数据成员(和基本子对象)(如果有的话)。

谁能向我解释为什么它没有制作平面副本?

因为那会被严重破坏。一个类定义了一个复制构造函数,因为它必须以某种方式被复制;在 的情况下std::string,它必须创建一个新的缓冲区。如果新字符串只是简单地保存了对方指针的副本,那么两者都会认为他们拥有相同的缓冲区,并且在它们被销毁时都会尝试释放它。

于 2012-07-25T08:46:28.710 回答