C++のコンストラクタとは?デフォルトコンストラクタと引数付きコンストラクタの使い方を解説
C++のコンストラクタとは
コンストラクタ(constructor)とは、クラスの新しいオブジェクトが生成される瞬間に自動的に呼び出される特別なメンバ関数です。コンストラクタには以下のような特徴があります。
- 関数名がクラス名と同じである
- 戻り値の型を持たない(voidも指定しない)
- オブジェクト生成時に自動的に実行される
コンストラクタの主な役割は、クラスのメンバ変数に初期値を与えることです。これにより、オブジェクトは生成された時点で適切な状態を持つことが保証されます。
C++のコンストラクタには、主に「デフォルトコンストラクタ」と「引数付きコンストラクタ(パラメータ化コンストラクタ)」の2種類があります。以下、それぞれの特徴と使い方をサンプルコードとともに解説します。
デフォルトコンストラクタ
デフォルトコンストラクタは、引数を一切取らないコンストラクタです。プログラマが明示的に定義しなかった場合、コンパイラが暗黙的なデフォルトコンストラクタを自動的に提供します。ただし、暗黙的に生成された場合、ローカルオブジェクトのメンバ変数は自動的には初期化されないため、明示的にデフォルトコンストラクタを定義して初期値を設定しておくのが安全です。
以下は、デフォルトコンストラクタの動作を示すサンプルプログラムです。
サンプルコード
#include <iostream>
using namespace std;
class A {
private:
int num1, num2;
public:
// デフォルトコンストラクタ
A() {
num1 = 5;
num2 = 7;
}
void display() {
cout<<"num1 = "<< num1 <<endl;
cout<<"num2 = "<< num2 <<endl;
}
};
int main() {
A obj;
obj.display();
return 0;
}
実行結果
num1 = 5
num2 = 7
このプログラムでは、クラスAがデフォルトコンストラクタを持ち、num1とnum2をそれぞれ5と7で初期化しています。また、これらの値を出力するdisplay()関数も定義しています。該当するコードは以下のとおりです。
class A {
private:
int num1, num2;
public:
A() {
num1 = 5;
num2 = 7;
}
void display() {
cout<<"num1 = "<< num1 <<endl;
cout<<"num2 = "<< num2 <<endl;
}
};main()関数内では、クラスA型のオブジェクトobjを定義しています。この時点でデフォルトコンストラクタが自動的に呼び出され、その後display()関数を呼び出して値を表示しています。
A obj;
obj.display();
引数付きコンストラクタ(パラメータ化コンストラクタ)
引数付きコンストラクタは、オブジェクトの生成時に引数を受け取り、その値でメンバ変数を初期化できるコンストラクタです。引数の渡し方は通常の関数と同じで、コンストラクタ名の後の括弧内にパラメータを記述します。引数付きコンストラクタは、暗黙的にも明示的にも呼び出すことが可能です。
以下は、引数付きコンストラクタの動作を示すサンプルプログラムです。
サンプルコード
#include <iostream>
using namespace std;
class A {
private:
int num1, num2;
public:
// 引数付きコンストラクタ
A(int n1, int n2) {
num1 = n1;
num2 = n2;
}
void display() {
cout<<"num1 = "<< num1 <<endl;
cout<<"num2 = "<< num2 <<endl;
}
};
int main() {
A obj(3,8);
obj.display();
return 0;
}
実行結果
num1 = 3
num2 = 8
このプログラムでは、クラスAが引数付きコンストラクタを持ち、渡された引数n1とn2の値でnum1とnum2を初期化しています。display()関数でこれらの値を出力します。該当するコードは以下のとおりです。
class A {
private:
int num1, num2;
public:
A(int n1, int n2) {
num1 = n1;
num2 = n2;
}
void display() {
cout<<"num1 = "<< num1 <<endl;
cout<<"num2 = "<< num2 <<endl;
}
};main()関数内では、A obj(3,8); のようにオブジェクト定義時に引数を渡しています。これにより、オブジェクト生成の瞬間にnum1が3、num2が8で初期化され、display()関数の呼び出しでその値が表示されます。
A obj(3,8);
obj.display();
まとめ
コンストラクタは、オブジェクト生成時に自動的に実行され、メンバ変数を初期化するための特別な関数です。引数を取らないデフォルトコンストラクタと、引数を受け取って柔軟に初期化できる引数付きコンストラクタの2種類を正しく理解することで、C++におけるオブジェクト指向プログラミングの基礎をしっかりと身につけることができます。
-
C++のデストラクタとは?基本構文と使い方を実例で解説
デストラクタ(Destructor)は、C++のクラスに属する特別なメンバ関数の一つで、オブジェクトを破棄する役割を担います。関数の終了やプログラムの終了、deleteによる明示的な削除など、オブジェクトがスコープ外に出るタイミングで自動的に呼び出されます。 デストラクタは通常のメンバ関数とは異なり、引数を受け取らず、戻り値も返しません。また、クラス名と同じ名前を持ち、その先頭にはチルダ(~)を付けるのが決まりです。なお、デストラクタはオーバーロードできないため、1つのクラスに定義できるのは1つだけという点にも注意しましょう。 以下に、C++におけるデストラクタの動作を確認できるサンプルプログ
-
C++のコピーコンストラクタとは?仕組みと実装方法をサンプルコード付きで解説
コピーコンストラクタは、コンストラクタの一種です。同じクラスのオブジェクトを受け取り、その値を使って新しいオブジェクトを生成・初期化します。もしクラス内でコピーコンストラクタが定義されていない場合、コンパイラが自動的にデフォルトのコピーコンストラクタを生成します。ただし、ポインタ変数や動的メモリ確保(new/delete)を持つクラスでは、デフォルトのコピーは浅いコピー(shallow copy)となり、同じメモリ領域を複数のオブジェクトが参照してしまう問題が発生します。そのため、このようなクラスでは独自のコピーコンストラクタを定義することが必須となります。コピーコンストラクタのサンプルプログ