2011-08-09 9 views
2

フェロースタッカー、初期化データメンバ参照は++

は、ヘッダファイルに次の2つの単純なクラスを考える:

Class CC 
{ 
public: 
CC(int& value); 
C& operator=(const C& other); 
{ 
    cout<<" From copy constructor "; 
} 

int m_cc; 
}; 

Class AA 
{ 
public: 
AA(CC& refCC); 

CC m_cInstance; 
} 

以下の.cppファイルです。私は上記の二つが私のmain.cppをファイルにfollwing方法で、簡単なクラスを宣言した使用

CC:CC(int& value): m_cc(value) 
{ 
    cout<<" Constructor of CC" <<endl; 
    m_cc++; 
} 

AA:AA(CC& refCC): m_cInstance(refCC) 
{ 
    cout<<" The value of m_cc in refCC is: "<< refCC.m_cc; 
    cout<<" The address of m_cc in refCC is: "<< &refCC.m_cc; 
    cout<<" The address of refCC is: "<< &refCC; 

    cout<<" The value of m_cc in m_cInstance is: <<m_cInstance.m_cc; 
    cout<<" The address of m_cc in m_cInstance is: <<&m_cInstance.m_cc; 
    cout<<" The address of m_cInstance is: <<&m_cInstance; 
} 

int型のcvalue = 1000; CC refCC(cvalue);

AA aaObj(refCC)。ここで

は、プログラムの出力です:インスタンスAAでm_cInstanceのアドレスがrefCCのアドレスと異なることを

  1. は注意:ここで

    Constructor of CC 
    The value of m_cc in refCC is: 1001 
    The address of m_cc in refCC is: 0x12ff20 
    The address of refCC is: 0x12ff20 
    
    The value of m_cc in m_cInstance is: 1001 
    The address of m_cc in m_cInstance is: 0x12ff14 
    The address of m_cInstance is: 0x12ff14 
    

    は、いくつかの観測です。

  2. AAのコンストラクタで参照(refCC)によってCCのインスタンスが渡されますが、メンバ変数 "m_cInstance"は単独のインスタンスです。 「refCC」が作成されるとCCに

  3. インスタンスのコンストラクタは、CC 2つの異なるインスタンスが同じ状態を運ぶプログラム中に存在するにもかかわらず、一度呼び出されます。

  4. オーバーライドされた代入演算子が呼び出されることはありません。

私の質問は簡単です:

「m_cInstanceは」CCのコンストラクタの呼び出しやCCで定義された代入演算子なしAAのコンストラクタで作成されてどのように?

そしてCCは、メンバ変数としてディスク上のファイルへのハンドルが含まれている場合

? "m_cInstance"での動作は何ですか?ありがとう、

+0

1のような宣言を持っています。コンストラクタに構文エラーがあります。 2. 'operator ='はコピーコンストラクタではなく、代入演算子です。そしてあなたは正しいです、あなたのコードは決してそれを使用しません。コピー構成を使用しますが、コピーコンストラクターは定義していません。 –

+0

'CC :: CC(int&value):: m_cc(value)'は 'CC :: CC(int&value):m_cc(value)'と同じでなければなりません。 –

+0

クラス "AA"にメンバー "m_cc"がないので、 "AA:AA(CC&refCC):m_cc(refCC)"という行はコンパイルされません。したがって、あなたが求めているコードを投稿しているわけではありません。コードXとポストコードYについて質問するのはかなり愚かです。 –

答えて

2

m_cInstanceは(あなたのケースで提供コンパイラ)をコピーコンストラクタを使用して作成されます。あなたが代入演算子を定義する必要がある場合は健全性チェックとして、あなたはおそらく(3 hereon wikipediaの原則として知っている)だけでなくコピーコンストラクタとデストラクタを定義する必要があり

+0

クラスのためにデフォルトで作成されるその他の構文やメソッドは何ですか?それは標準の一部ですか? –

+1

http://stackoverflow.com/questions/4172722を参照してください。はい、標準です。 – AProgrammer

0

あなたしているコピーm_cInstanceを作成するために構築あなたはそれを記録しているようには見えません。 m_cInstancerefCCのコピーで一回更新され、インスタンス外の場合でもrefCC変更は変更されません。

0

クラスに(コンパイラによって)提供されているコピーコンストラクタがあります。正しく理解すれば、コピーコンストラクタで定義したoperator=(const C& other)が混乱している可能性があります。コピーコンストラクタがありますclass CCについては

はあなたの実際のコードをカット&ペーストする必要があり、この

CC(const CC& C);