MENU
コンテンツ再構築中

C++:オーバーロードについて > コンストラクタのオーバーロード(1)

C++の関数のオーバーロードの中からコンストラクタのオーバーロードについてのメモ。

INDEX

オーバーロードについて

コンストラクタをオーバーロードする目的は次の3つ。

  • 柔軟性を得る
  • 配列をサポートする
  • コピーコンストラクタを作成する

柔軟性を得る

オブジェクトの初期化をするかしないかを選択できるようにする。

サンプルコード
[code]
#include
using namespace std;

class Sample {
int x;

public:
Sample() { x = 0; }
Sample( int n) { x = n; }
int get_val() { return x; }
};

int main(int argc, const char * argv[])
{
Sample obj1;
Sample obj2(10);

cout << "obj1: " << obj1.get_val() << "\n"; cout << "obj2: " << obj2.get_val() << "\n"; return 0; } [/code]

結果
[code]
obj1: 0
obj2: 10
[/code]

配列をサポートする

動的配列は初期化することが出来ないため、初期値を受け取るコンストラクタがある場合、初期値を受け取らないコンストラクタをオーバーロードする必要がある。

サンプルコード
[code]
#include
using namespace std;

class Sample {
int x;

public:
Sample() { x = 0; }
Sample(int n) { x = n; }
int get_val() { return x; }
void set_val(int n) { x = n; }
};

int main(int argc, const char * argv[])
{
Sample obj(10);
Sample *p;

p = new Sample[5];
if (!p) {
cout << "error\n"; return 1; } int i; for (i=0; i<5; i++) { p[i] = obj; } for (i=0; i<5; i++) { cout << "p[" << i << "]: " << p[i].get_val() << "\n"; } return 0; } [/code]

結果
[code]
p[0]: 10
p[1]: 10
p[2]: 10
p[3]: 10
p[4]: 10
[/code]

コピーコンストラクタを作成する

関数にオブジェクト渡したり関数からオブジェクトを返すとき、一時的にオブジェクトのコピーが生成されるため、デストラクタが複数回実行され、望ましくない影響が出る可能性がある。

オブジェクトのコピー生成時の実行処理を定義するために、コピーコンストラクタを作成しオブジェクトのコピーが生成されるときの処理を正確に指定することができる。

コピーコンストラクタの定義
[code]
クラス名 (const クラス名 &obj) {
// 処理
}
[/code]
サンプルコード
[code]
#include
#include
using namespace std;

class Sample {
int *p;
int size;

public:
// コンストラクタ
Sample(int n) {
p = new int[n];
if(!p) exit(1);
size = n;
cout << "コンストラクタ\n"; } // デストラクタ ~Sample() { delete [] p; cout << "デストラクタ\n"; } //コピーコンストラクタの定義 Sample(const Sample &a); void set_val(int i, int j) { if (i>=0 && i=0; i–) {
cout << x.get_val(i); } cout << "\n"; return 0; } [/code]

結果
[code]
コンストラクタ
0123456789
コピーコンストラクタ
9876543210
デストラクタ
デストラクタ
[/code]
補足説明
  • コピーコンストラクタは初期化の状況にしか対処出来ない(代入には使用できない)

まとめ

この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

Please share it!
  • URLをコピーしました!
  • URLをコピーしました!
INDEX