为什么使用字符串的复制构造函数

Why is the copy constructor of the string used?

本文关键字:复制 构造函数 字符串 为什么      更新时间:2023-10-16

我有以下代码:

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。

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

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

自动生成的副本构造函数为其所有成员变量调用构造函数(如果它们有一个)。

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

由于我没有为我的类定义复制构造函数,所以我希望生成一个平面副本,包括std::字符串中的指针。

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

有人能向我解释一下为什么它没有做成平面复制品吗?

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