C++ のコンストラクター
C++ のコンストラクター は、オブジェクトの作成時に自動的に呼び出される特別なメソッドです。一般に、新しいオブジェクトのデータ メンバーを初期化するために使用されます。 C++ のコンストラクターは、クラスまたは構造体と同じ名前を持ちます。これは値を構築します。つまり、オブジェクトにデータを提供するため、コンストラクターと呼ばれます。
- コンストラクターはクラスのメンバー関数であり、その名前はクラス名と同じです。
- コンストラクターは、同じクラスのオブジェクトの作成時に、クラスのオブジェクトのデータ メンバーを自動的に初期化するために使用される特殊なタイプのメンバー関数です。
- コンストラクターはオブジェクトの作成時に呼び出されます。これは値を構築します。つまり、オブジェクトにデータを提供するため、コンストラクターと呼ばれます。
- コンストラクターは値を返さないため、戻り値の型がありません。
- クラスのオブジェクトを作成すると、コンストラクターが自動的に呼び出されます。
- コンストラクターはオーバーロードできます。
- コンストラクターを仮想として宣言することはできません。
C++ のコンストラクターの構文
コンストラクターのプロトタイプは次のようになります。
(list-of-parameters);
コンストラクターはクラス宣言の内部または外部で定義できます。
クラス内でコンストラクターを定義するための構文
(list-of-parameters) { // constructor definition } クラス外でコンストラクターを定義するための構文
: :(list-of-parameters) { // constructor definition } C++ のコンストラクターの例
以下の例は、C++ でクラスのコンストラクターを宣言する方法を示しています。
例 1: クラス内でのコンストラクターの定義
C++
// defining the constructor within the class> #include> using> namespace> std;> class> student {> > int> rno;> > char> name[50];> > double> fee;> public> :> > // constructor> > student()> > {> > cout < <> 'Enter the RollNo:'> ;> > cin>>rno;>> > cout < <> 'Enter the Name:'> ;> > cin>> 名前;>> ;> > cin>> 料金;>>' < < name < <> ' '> < < fee;> > }> };> int> main()> {> > student s;> // constructor gets called automatically when> > // we create the object of the class> > s.display();> > return> 0;> }> |
出力
Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000
例 2: クラス外でのコンストラクターの定義
C++
// defining the constructor outside the class> #include> using> namespace> std;> class> student {> > int> rno;> > char> name[50];> > double> fee;> public> :> > // constructor declaration only> > student();> > void> display();> };> // outside definition of constructor> student::student()> {> > cout < <> 'Enter the RollNo:'> ;> > cin>>rno;>> > cout < <> 'Enter the Name:'> ;> > cin>> 名前;>>' ;> > cin>> 料金;>>' < < name < <> ' '> < < fee;> }> // driver code> int> main()> {> > student s;> > s.display();> > return> 0;> }> |
出力
Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111
注記: クラスの外で定義されたコンストラクターを次のように作成できます。 列をなして クラス内定義と同等にするために。ただし、注意してください 列をなして これはコンパイラへの命令ではなく、コンパイラが状況に応じて実装するかどうかを決定する単なる要求です。
C++ のコンストラクターの特徴
C++ のコンストラクターの主な特徴を次に示します。
- コンストラクターの名前はクラス名と同じです。
- コンストラクターは、クラスのプライベート セクションで宣言することもできますが、ほとんどの場合、クラスのパブリック セクションで宣言されます。
- コンストラクターは値を返しません。したがって、戻り値の型がありません。
- クラスのオブジェクトを作成すると、コンストラクターが自動的に呼び出されます。
- コンストラクターはオーバーロードできます。
- コンストラクターを仮想として宣言することはできません。
- コンストラクターは継承できません。
- コンストラクタのアドレスは参照できません。
- コンストラクターは暗黙的に呼び出しを行います。 新しい そして 消去 メモリ割り当て中の演算子。
C++ のコンストラクターの種類
コンストラクターは、使用される状況に基づいて分類できます。 C++ には 4 種類のコンストラクターがあります。
- デフォルトのコンストラクター
- パラメータ化されたコンストラクタ
- コピーコンストラクター
- 移動コンストラクター
実際の例を挙げて、C++ のコンストラクターの種類を理解してみましょう。あなたがマーカーを買うために店に行ったとします。マーカーを購入したい場合、どのような選択肢がありますか?まず、お店に行って、マーカーをくださいと言います。つまり、マーカーをくださいと言っただけで、どのブランド名とどの色を指定したわけではなく、マーカーが欲しいと言うだけで何も言及しなかったということになります。それで、市場や彼の店で頻繁に売られているマーカーが何であれ、マーカーが欲しいと言ったら、彼はそれを渡すだけです。これがデフォルトのコンストラクターです。
2 番目の方法は、お店に行って、色が赤でブランドが XYZ のマーカーが欲しいと言う方法です。それで、あなたがこれについて言及すると、彼はあなたにそのマーカーを与えるでしょう。したがって、この場合はパラメータを指定しました。これがパラメータ化されたコンストラクターです。
3 つ目は、お店に行って、このようなマーカー (手に物理的なマーカー) が欲しいと言います。したがって、店主はそのマーカーを見ることになります。わかりました、そして彼はあなたのために新しいマーカーをくれるでしょう。そのマーカーのコピーです。それがコピー コンストラクターです。
ここで、新しいマーカーを購入するのではなく、友人のマーカーの所有権を取得すると仮定します。これは、新しいリソースを取得するのではなく、既存のリソースの所有権を取得することを意味します。それが移動コンストラクターです。
1. C++ のデフォルトのコンストラクター
あ デフォルトのコンストラクター 引数をとらないコンストラクターです。パラメータはありません。引数なしのコンストラクターとも呼ばれます。
デフォルトコンストラクターの構文
className() { // body_of_constructor } デフォルトのコンストラクターの例
以下の例は、C++ でデフォルトのコンストラクターを使用する方法を示しています。
例 1:
CPP
// C++ program to illustrate the concept of default> // constructors> #include> using> namespace> std;> class> construct {> public> :> > int> a, b;> > // Default Constructor> > construct()> > {> > a = 10;> > b = 20;> > }> };> int> main()> {> > // Default constructor called automatically> > // when the object is created> > construct c;> > cout < <> 'a: '> < < c.a < < endl < <> 'b: '> < < c.b;> > return> 1;> }> |
出力
a: 10 b: 20
注記: コンストラクターを明示的に定義しない場合でも、コンパイラーは暗黙的にデフォルトのコンストラクターを自動的に提供します。
例 2:
C++
// C++ program to demonstrate the implicit default> // constructor> #include> using> namespace> std;> // class> class> student {> > int> rno;> > char> name[50];> > double> fee;> public> :> };> int> main()> {> > // creating object without any parameters> > student s;> > return> 0;> }> |
出力
(no output)
ご覧のとおり、明示的なデフォルト コンストラクターを定義していない場合でも、引数を渡さずにクラス Student のオブジェクトを作成できます。
2. C++ のパラメーター化されたコンストラクター
パラメーター化されたコンストラクターを使用すると、コンストラクターに引数を渡すことができます。通常、これらの引数は、オブジェクトの作成時にオブジェクトを初期化するのに役立ちます。パラメーター化されたコンストラクターを作成するには、他の関数と同じようにパラメーターを追加するだけです。コンストラクターの本体を定義するときは、パラメーターを使用してオブジェクトを初期化します。
パラメータ化されたコンストラクタの構文
className (parameters...) { // body } パラメータ化されたコンストラクタの例
以下の例は、C++ でパラメーター化されたコンストラクターを使用する方法を示しています。
例 1: クラス内でのパラメーター化されたコンストラクターの定義。
CPP
// CPP program to illustrate parameterized constructors> #include> using> namespace> std;> class> Point {> private> :> > int> x, y;> public> :> > // Parameterized Constructor> > Point(> int> x1,> int> y1)> > {> > x = x1;> > y = y1;> > }> > int> getX() {> return> x; }> > int> getY() {> return> y; }> };> int> main()> {> > // Constructor called> > Point p1(10, 15);> > // Access values assigned by constructor> > cout < <> 'p1.x = '> < < p1.getX()> > < <> ', p1.y = '> < < p1.getY();> > return> 0;> }> |
出力
p1.x = 10, p1.y = 15
例 2: クラス外でパラメータ化されたコンストラクターを定義します。
C++
// C++ Program to illustrate how to define the parameterized> // constructor outside the class> #include> #include> using> namespace> std;> // class definition> class> student {> > int> rno;> > char> name[50];> > double> fee;> public> :> > student(> int> ,> char> [],> double> );> > void> display();> };> // parameterized constructor outside class> student::student(> int> no,> char> n[],> double> f)> {> > rno = no;> > strcpy> (name, n);> > fee = f;> }> void> student::display()> {> > cout < < endl < < rno < <> ' '> < < name < <> ' '> < < fee;> }> // driver code> int> main()> {> > student s(1001,> 'Ram'> , 10000);> > s.display();> > return> 0;> }> |
出力
1001 Ram 10000
オブジェクトがパラメーター化されたコンストラクターで宣言されている場合、初期値を引数としてコンストラクター関数に渡す必要があります。通常のオブジェクト宣言方法は機能しない可能性があります。パラメーター化されたコンストラクターは、明示的または暗黙的に呼び出すことができます。
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call
パラメーター化されたコンストラクターが定義され、デフォルトのコンストラクターが明示的に定義されていない場合、コンパイラーはデフォルトのコンストラクターを暗黙的に作成しないため、次のような単純なオブジェクトが作成されます。
Student s;
エラーが点滅します。
例 3:
C++
// C++ Program to illustrate the error caused be not> // defining the explicit defualt constructor after> // parameterized constructor> #include> #include> using> namespace> std;> // class definition> class> student {> > int> rno;> > char> name[50];> > double> fee;> public> :> > student(> int> no,> char> n[],> double> f)> > {> > rno = no;> > strcpy> (name, n);> > fee = f;> > }> };> // driver code> int> main()> {> > student s;> // this will cause error> > return> 0;> }> |
出力
main.cpp: In function ‘int main()’: main.cpp:25:13: error: no matching function for call to ‘student::student()’ 25 | student s; // this will cause error | ^ main.cpp:14:5: note: candidate: ‘student::student(int, char*, double)’ 14 | student(int no, char n[], double f) | ^~~~~~~ main.cpp:14:5: note: candidate expects 3 arguments, 0 provided main.cpp:8:7: note: candidate: ‘constexpr student::student(const student&)’ 8 | class student { | ^~~~~~~ main.cpp:8:7: note: candidate expects 1 argument, 0 provided main.cpp:8:7: note: candidate: ‘constexpr student::student(student&&)’ main.cpp:8:7: note: candidate expects 1 argument, 0 provided ^~ 重要な注意点: クラスに対して 1 つ以上の非デフォルト コンストラクター (パラメーター付き) を定義するときは常に、デフォルト コンストラクター (パラメーターなし) も明示的に定義する必要があります。この場合、コンパイラーはデフォルト コンストラクターを提供しないためです。ただし、必須ではありませんが、常にデフォルトのコンストラクターを定義することがベスト プラクティスであると考えられます。
パラメーター化されたコンストラクターの使用法
- これは、さまざまなオブジェクトの作成時に、さまざまなデータ要素をさまざまな値で初期化するために使用されます。
- コンストラクターをオーバーロードするために使用されます。
C++ パラメータ化コンストラクターのデフォルト引数
通常の関数と同様に、パラメータ化されたコンストラクターの引数のデフォルト値を定義することもできます。のすべてのルール デフォルトの引数 これらのパラメータに適用されます。
例 3: デフォルト値を使用したパラメーター化されたコンストラクターの定義
C++
// C++ Program to illustrate how to use default arguments> // with parameterized constructor> #include> using> namespace> std;> // class> class> GFG {> private> :> > int> data;> public> :> > // parameterized constructor with default values> > GFG(> int> x = 0) { data = x; }> > int> getData() {> return> data; }> };> int> main()> {> > GFG obj1;> // will not throw error> > GFG obj2(25);> > cout < <> 'First Object Data: '> < < obj1.getData() < < endl;> > cout < <> 'Second Object Data: '> < < obj2.getData()> > < < endl;> > return> 0;> }> |
出力
First Object Data: 0 Second Object Data: 25
ご覧のとおり、パラメーター化されたコンストラクターのすべての引数にデフォルト値が割り当てられている場合、デフォルト コンストラクターと同様に、パラメーターを渡さずにオブジェクトを作成することは正当です。 したがって、このタイプのコンストラクターは、デフォルトのコンストラクターとパラメーター化されたコンストラクターの両方として機能します。
3. C++ でコンストラクターをコピーする
コピー コンストラクターは、同じクラスの別のオブジェクトを使用してオブジェクトを初期化するメンバー関数です。
の構文 コピーコンストラクター
コピーコンストラクター 同じクラスのオブジェクトへの参照を引数として受け取ります。
ClassName (ClassName &obj) { // body_containing_logic } デフォルトのコンストラクターと同様に、明示的なコピー コンストラクター定義が存在しない場合、C++ コンパイラーは暗黙的なコピー コンストラクターも提供します。ここで、任意のタイプの明示的なコンストラクターが存在すると暗黙的なデフォルト コンストラクターが削除されるデフォルト コンストラクターとは異なり、明示的なコピー コンストラクターがない場合、暗黙的なコピー コンストラクターは常にコンパイラーによって作成されることに注意してください。または明示的な移動コンストラクターが存在します。
コピーコンストラクターの例
以下の例は、C++ でコピー コンストラクターを使用する方法を示しています。
例 1: 暗黙的なコピー コンストラクターの図
C++
// C++ program to illustrate the use of Implicit copy> // constructor> #include> using> namespace> std;> class> Sample {> > int> id;> public> :> > // parameterized constructor> > Sample(> int> x) { id = x; }> > void> display() { cout < <> 'ID='> < < id; }> };> int> main()> {> > Sample obj1(10);> > obj1.display();> > cout < < endl;> > // creating an object of type Sample from the obj> > Sample obj2(obj1);> // or obj2=obj1;> > obj2.display();> > return> 0;> }> |
出力
ID=10 ID=10
例 2: 明示的コピーコンストラクターの定義
C++
// C++ Program to demonstrate how to define the explicit> // copy constructor> #include> using> namespace> std;> class> Sample {> > int> id;> public> :> > // default constructor with empty body> > Sample() {}> > // parameterized constructor> > Sample(> int> x) { id = x; }> > // copy constructor> > Sample(Sample& t) { id = t.id; }> > void> display() { cout < <> 'ID='> < < id; }> };> // driver code> int> main()> {> > Sample obj1(10);> > obj1.display();> > cout < < endl;> > // copy constructor called> > Sample obj2(obj1);> // or obj2=obj1;> > obj2.display();> > return> 0;> }> |
出力
ID=10 ID=10
例 3: パラメーター化されたコンストラクターを使用した明示的なコピー コンストラクターの定義
C++
// C++ program to demonstrate copy construction along with> // parameterized constructor> #include> #include> using> namespace> std;> // class definition> class> student {> > int> rno;> > char> name[50];> > double> fee;> public> :> > student(> int> ,> char> [],> double> );> > student(student& t)> // copy constructor> > {> > rno = t.rno;> > strcpy> (name, t.name);> > fee = t.fee;> > }> > void> display();> };> student::student(> int> no,> char> n[],> double> f)> {> > rno = no;> > strcpy> (name, n);> > fee = f;> }> void> student::display()> {> > cout < < endl < < rno < <> ' '> < < name < <> ' '> < < fee;> }> int> main()> {> > student s(1001,> 'Manjeet'> , 10000);> > s.display();> > student manjeet(s);> // copy constructor called> > manjeet.display();> > return> 0;> }> |
出力
1001 Manjeet 10000 1001 Manjeet 10000
コピーコンストラクターの使用法
- 既存のオブジェクトから値をコピーして、新しいオブジェクトを構築します。
- ディープコピーを実行するために使用できます。
- 必要に応じて、コピー プロセス中に特定の属性を変更します。
4. C++ でのコンストラクターの移動
move コンストラクターは、C++ のコンストラクター ファミリに最近追加されたものです。これは、既存のオブジェクトからオブジェクトを構築するコピー コンストラクターに似ていますが、新しいメモリにオブジェクトをコピーする代わりに、移動セマンティクスを利用して、追加のオブジェクトを作成することなく、すでに作成されたオブジェクトの所有権を新しいオブジェクトに転送します。コピー。
他のオブジェクトからリソースを盗むと見なすこともできます。
C++ の Move コンストラクターの構文
className (className&& obj) { // body of the constructor } の 移動コンストラクター かかります 右辺値参照 同じクラスのオブジェクトの所有権を削除し、このオブジェクトの所有権を新しく作成されたオブジェクトに転送します。
コピー コンストラクターと同様に、コンパイラは、明示的な移動コンストラクターを持たないクラスごとに移動コンストラクターを作成します。
移動コンストラクターの例
以下の例は、C++ で移動コンストラクターを使用する方法を示しています。
例 1: 移動コンストラクターの定義
C++
// C++ Program to illustrate how to define a move> // constructor> #include> using> namespace> std;> class> Box {> public> :> > int> * data;> // Pointer to an integer value> > // Constructor> > Box(> int> value)> > {> > data => new> int> ;> > *data = value;> > }> > // Move constructor> > Box(Box&& other) noexcept> > {> > cout < <> 'Move Constructor Called'> < < endl;> > data = other.data;> // Transfer ownership of 'other'> > // data> > other.data = nullptr;> // Null out 'other' to prevent> > // double deletion> > }> > // Destructor> > ~Box() {> delete> data; }> };> int> main()> {> > // Create a Box with value 42> > Box originalBox(42);> > // Create a new Box by moving resources from the> > // originalBox> > Box newBox(move(originalBox));> > cout < <> 'newBox.data: '> < < *newBox.data;> > // originalBox is now in a valid but unspecified> > // state (its resources were moved to newBox)> > return> 0;> }> |
出力
Move Constructor Called newBox.data: 42
Move コンストラクターの使用法
- コピーを作成する代わりに、移動コンストラクターはこれらのリソースの所有権を効率的に譲渡します。
- これにより、不必要なメモリのコピーが防止され、オーバーヘッドが削減されます。
- 独自の移動コンストラクターを定義して、特定のリソース転送を処理できます。
C++ のデストラクター
デストラクターもコンストラクターと同様の特別なメンバー関数です。デストラクターは、コンストラクターによって作成されたクラス オブジェクトを破棄します。デストラクターの名前は、クラス名の前にチルダ (~) 記号が付いているものと同じです。複数のデストラクターを定義することはできません。デストラクターは、コンストラクターによって作成されたオブジェクトを破棄する 1 つの方法にすぎません。したがって、デストラクターをオーバーロードすることはできません。デストラクターは引数を必要とせず、値を返しません。オブジェクトがスコープ外になると、自動的に呼び出されます。デストラクターは、コンストラクターによって作成されたオブジェクトが占有しているメモリ領域を解放します。で 駆逐艦 、オブジェクトはオブジェクトの作成と逆の手順で破棄されます。
C++ のデストラクターの構文
コンストラクターと同様に、デストラクターもクラスの内部または外部で定義できます。
クラス内でデストラクターを定義するための構文
~ (){} クラス外でデストラクターを定義するための構文
: : ~(){} C++ のデストラクターの例
以下の例は、C++ でデストラクターを使用する方法を示しています。
例 1: 単純なデストラクターの定義
C++
#include> using> namespace> std;> class> Test {> public> :> > Test() { cout < <> '
Constructor executed'> ; }> > ~Test() { cout < <> '
Destructor executed'> ; }> };> main()> {> > Test t;> > return> 0;> }> |
出力
Constructor executed Destructor executed
例 2: オブジェクトの作成と破棄の回数をカウントする
C++
// C++ Program to count the number of objects created and> // destroyed> #include> using> namespace> std;> // global variable to count> int> count = 0;> // class definition> class> Test {> public> :> > Test()> > {> > count++;> > cout < <> 'No. of Object created: '> < < count < < endl;> > }> > ~Test()> > {> > cout < <> 'No. of Object destroyed: '> < < count> > < < endl;> > --count;> > }> };> // driver code> int> main()> {> > Test t, t1, t2, t3;> > return> 0;> }> |
出力
No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1
C++ のデストラクターの特徴
C++ のデストラクターの主な特徴を次に示します。
- デストラクターは、対応するコンストラクターがスコープ外になり、プログラムで不要になったメモリ空間を解放すると、コンパイラーによって自動的に呼び出されます。
- デストラクターは引数を必要とせず、値も返さないため、オーバーロードできません。
- デストラクターを static および const として宣言することはできません。
- デストラクターはプログラムの public セクションで宣言する必要があります。
- デストラクターは、コンストラクター呼び出しとは逆の順序で呼び出されます。
C++ コンストラクターに関するよくある質問
明示的に提供しない場合、デフォルトでコンパイラによって生成される関数は何ですか?
明示的に指定しない場合、デフォルトでコンパイラーによって生成される関数は次のとおりです。
- デフォルトのコンストラクター
- コピーコンストラクター
- 移動コンストラクター
- 代入演算子
- デストロイヤー
コンストラクターを非公開にできますか?
はい、C++ ではコンストラクターをプライベートにすることができます。これは、外部コードがそのクラスのオブジェクトを直接作成できないことを意味します。
コンストラクターは通常のメンバー関数とどう違うのでしょうか?
コンストラクターは、次の点で通常の関数とは異なります。
- コンストラクターはクラス自体と同じ名前です
- デフォルトのコンストラクターには入力引数がありませんが、コピーおよびパラメーター化されたコンストラクターには入力引数があります
- コンストラクターには戻り値の型がありません
- コンストラクターは、オブジェクトの作成時に自動的に呼び出されます。
- クラスのパブリックセクションに配置する必要があります。
- コンストラクターを指定しない場合、C++ コンパイラーはオブジェクトのデフォルトのコンストラクターを生成します (パラメーターを期待せず、空の本体を持ちます)。
クラス内に複数のコンストラクターを含めることはできますか?
はい、クラス内に複数のコンストラクターを含めることができます。いわゆる コンストラクターのオーバーロード 。
関連記事:
- C++ のデストラクター
- C++ のコンストラクターに関するクイズ
- C++ プログラムの出力 |セット 26 (コンストラクター)
- C++ プログラムの出力 |セット 27 (コンストラクターとデストラクター)