1

Directory特定のメンバーとそれに続くコピーコンストラクターで呼び出されるクラスがあります。

class  Directory{

private:
    char * Name;                
    int Telephone_Number;   
    char * Address;             
public:
    Directory (Directory & b)    
    {
        Name = new char [10];   //Just assume that the name will not be greater than                                    //10 characters
        Address = new char [30]; //Same here 
        strcpy (Name, b.Name);
        Telephone_Number = b.Telephone_Number;
        strcpy (Address, b.Address);
    }
};

コピー コンストラクターがディープ コピーまたはシャロー コピーを実行するかどうかを知りたかったのです。深いコピーAddressでありName、新しいメモリが割り当てられているためであることは理解していますが、どうTelephone_Numberですか?

私のコードは、浅いコピーまたは深いコピーを行っていますか? コピーコンストラクター全般について説明してもらえますか?

4

6 に答える 6

2

Telephone_Numberはクラス内で として宣言されint、値によってコピーされます (参照やポインターなどはありません)。したがって、このコンストラクターはディープ コピーを実行します。

ウィキペディアや優れた C++ の書籍で、コピー コンストラクターに関する多くの情報を入手できます。まずそのようなものを読んでから、他に特定の質問がないかどうかを確認してください。

オブジェクトを初期化および割り当てる際にコピー コンストラクターを使用する方法を管理する重要な規則があり、理解する必要があります。

于 2013-03-20T15:07:01.370 に答える
1

Address と Name に新しいメモリが割り当てられているため、これは明らかにディープ コピーですが、Telephone_Number はどうでしょうか。

電話番号と同様に、int は常にディープ コピーされます。

私の現在のコードは、浅いコピーまたは深いコピーを行っていますか?

深い

一般的なコピー コンストラクターとコピー コンストラクターを具体的に説明してくれる人はいますか?

コンパイラによって合成されたコピー コンストラクターは、メンバー コピーごとにメンバーを生成するだけです。つまり、その内容ではなく、ポインター値がコピーされます。コンパイラ合成のコピー コンストラクタは常に浅いです。ディープ コピーが必要なときはいつでも、クラスの作成者がそれを作成する必要があります (あなたが行ったように)。

また、コピー コンストラクターのシグネチャは、元のオブジェクト (ここではb) をconst参照で渡すように修正して、偶発的な変更を防ぐ必要があります。

Directory (Directory const & b) 
                     ^^^^^^
于 2013-03-20T15:16:18.557 に答える
0
Name = new char [10];
Address = new char [30]; //Same here 
strcpy (Name, b.Name);
strcpy (Address, b.Address);

Name と Address には、実際の文字列へのメモリ アドレスが含まれます。したがって、'Name'/'Address' をコピーするときは、'Name'/'Address' が指す実際のコンテンツをコピーする必要があります。

b.Name = Name; 
b.Address = Address;

誰かによって作成され、その誰かによって削除される可能性のあるデータを指しているだけです.誰かが実際のコンテンツを削除した場合、コンテンツが利用可能であると仮定してコンテンツを指しています.今、ポインターはぶら下がっています(何も指していません)。これが、コピー コンストラクターを使用する理由です。

Telephone_Number = b.Telephone_Number;

「Telephone_Number」は実際の値を保持しているため、値をコピーするには浅いコピーで十分です

名前/アドレスにはメモリ アドレスが含まれ、浅いコピーは実際の値のメモリ アドレスのみをコピーします。

Telephone_Number は整数値を持ち、浅いコピーはその整数値をコピーします

したがって、コピー コンストラクターは「PERFECT」でディープ コピーを実行します。

于 2015-04-22T12:07:08.943 に答える
0

他の人が言ったように、それは深いコピーです。

一般に、コピー コンストラクターを使用するときの考え方は、ディープ コピーを取得することです。コピーがオリジナルとデータを共有しないことを意味します。

それでは、以下を見てみましょう。

Directory B = new Directory(A);
A->DoSomething();
B->DoSomething();

A->DoSomething()上記のコードを読むと、 のデータにのみ影響することが予想されAます。同様にB->DoSomething()

ただし、ディープ コピー ルールには例外があります。おそらくデータが大きいため、コピーを作成するのは非効率的かもしれません:

class LargeData {
    int* PointerToLargeArray;
}

上記の場合、データではなくポインタをコピーするだけでコピー コンストラクタを実装できます。

LargeData(LargeData& b)
{
    PointerToLargeArray = b->PointerToLargeArray;
}
于 2013-03-20T15:18:29.507 に答える
0

ディープコピーです。int は値によってコピーされ、参照またはポインターをコピーしていません。

于 2013-03-20T15:06:34.283 に答える
0

ディープコピーです。整数は常にコピーされます。

于 2013-03-20T15:06:44.547 に答える