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コピーコンストラクタが使用されていますが、元の文字列を変更してもコピーは変更されなかったためです。

フラットコピーを作成しなかった理由を誰かに説明してもらえますか?

LinuxとGCC4.4.6を使用しています。

4

2 に答える 2

5

クラスのコピーコンストラクターを定義しなかったので、フラットコピーが作成されることを期待します

コピーコンストラクターを定義しなかったので、C++が定義しました。

自動生成されたコピーコンストラクターは、そのすべてのメンバー変数(存在する場合)のコンストラクターを呼び出します。

同様に、自動生成されたコンストラクタはすべてのメンバーのコンストラクタを呼び出し、デストラクタはすべてのメンバーのデストラクタを呼び出します。

于 2012-07-25T08:45:08.280 に答える
5

クラスのコピーコンストラクターを定義しなかったので、std::string内のポインターを含むフラットコピーが作成されることを期待します。

いいえ、暗黙的に生成されたコピーコンストラクターは、コピーコンストラクターがある場合はそのコピーコンストラクターを使用して、各データメンバー(およびベースサブオブジェクト)をコピーします。

フラットコピーを作成しなかった理由を誰かに説明してもらえますか?

それはひどく壊れてしまうからです。クラスは、特定の方法でコピーする必要があるため、コピーコンストラクターを定義します。の場合std::string、新しいバッファを作成する必要があります。新しい文字列が単に相手のポインタのコピーを保持している場合、両方が同じバッファを所有していると見なし、破棄されたときに両方がそれを割り当て解除しようとします。

于 2012-07-25T08:46:28.710 に答える