コピーコンストラクタがどういうものか、やっと判明したのでメモ。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 
-
|
|
|
!
 
 
-
|
|
|
|
|
!
 
class A
{
public:
  A();
  int x;
}
 
void func()
{
  A a;
  A b = a;
  /*
  b.x = a.x; が行われる。
  */
}

宣言しなくても、コピーコンストラクタは自動で作成され、
メンバ変数に対して、=演算子が用いられて代入されるんだそうです。
自動で作成されるってところが恐いところで、
メンバにnewしたポインタをもつようなクラスの場合、
コピーコンストラクタを明示的に定義するか、
コピーコンストラクタの宣言のみするかして、対策しないといけないのです。


次の例を見てみる。
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
-
|
!
|
|
|
|
-
|
!
|
|
|
|
|
!
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
!
 
 
 
 
 
#spanend
#spanadd
#include <cstdio>
#spanend
#spanadd
using namespace std;
#spanend
#spanadd
 
#spanend
#spanadd
class Test
#spanend
#spanadd
{
#spanend
#spanadd
public:
#spanend
  Test(float val):x(val)
  {
    printf( "Constructor\n" );
  }
#spanadd
 
#spanend
  ~Test()
  {
    printf( "Destructor\n" );
  }
#spanadd
 
#spanend
  float x;
#spanadd
};
#spanend
  
#spanadd
int main()
#spanend
#spanadd
{
#spanend
  Test a(3);
  Test b(4);
  printf( "%f\n" , b.x );
  b = a;
  printf( "%f\n" , b.x );
#spanadd
 
#spanend
  return 0;
#spanadd
}
#spanend
#spanadd
 
#spanend
#spanadd

出力結果:
Constructor
Constructor
4.000000
3.000000
Destructor
Destructor

b=aでは,デストラクタは呼ばれない。

なので,メンバ変数にnewしたものを持っていたら・・・ですね;

    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS