Top > C++ > コピーコンストラクタと代入演算子

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

Everything is expanded.Everything is shortened.
  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したポインタをもつようなクラスの場合、
コピーコンストラクタを明示的に定義するか、
コピーコンストラクタの宣言のみするかして、対策しないといけないのです。

次の例を見てみる。

Everything is expanded.Everything is shortened.
  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
 
 
 
 
-
|
|
-
|
!
|
|
-
|
!
|
|
!
 
 
-
|
|
|
|
|
|
|
!
 
#include <cstdio>
using namespace std;
 
class Test
{
public:
  Test(float val):x(val)
  {
    printf( "Constructor\n" );
  }
 
  ~Test()
  {
    printf( "Destructor\n" );
  }
 
  float x;
};
  
int main()
{
  Test a(3);
  Test b(4);
  printf( "%f\n" , b.x );
  b = a;
  printf( "%f\n" , b.x );
 
  return 0;
}

出力結果:

Constructor
Constructor
4.000000
3.000000
Destructor
Destructor

b=aでは,デストラクタは呼ばれない。
なので,メンバ変数にnewしたものを持っていたら・・・ですね;


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes
Last-modified: (5883d)