C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】構造体のコンストラクターとは?目的・構文・使い方を徹底解説

【C++】構造体のコンストラクターとは?目的・構文・使い方を徹底解説

C++におけるコンストラクターは、クラス型のオブジェクトや構造体を初期化するために必要なメンバー関数です。他のプログラミング言語と同様に、C++でもコンストラクターが用意されており、変数が未初期化のままになったり未定義の動作が発生したりすることを防ぐために、決められた手順でオブジェクトを生成する役割を担います。

この記事では、以下の内容について順番に解説していきます。

  • C++における「struct」コンストラクターとは?
  • C++でコンストラクターを定義する際の重要ポイント
  • C++における「struct」コンストラクターの構文
  • C++における「struct」コンストラクターの仕組み
  • デフォルトの「struct」コンストラクターの作成方法
  • 引数付きの「struct」コンストラクターの作成方法
  • C++で構造体のポインターを作成する方法
  • まとめ

C++では、「struct」は構造体と呼ばれ、その中でメンバー変数を初期化する特別なメンバー関数がコンストラクターです。構造体のコンストラクターを使うことで、異なるデータ型を混在させた複数の変数をひとつのまとまりとして定義できます。簡単に言えば、「struct」のコンストラクターとは、ユーザーがオブジェクトを宣言するたびに自動的に呼び出される特別なメソッドのことです。

C++でコンストラクターを定義する際の重要ポイント

C++でコンストラクターを定義するときに押さえておきたいポイントは次のとおりです。

  • コンストラクターの名前は、必ずそれが属するクラス名と同じになります。
  • ユーザーがコンストラクターを定義しなかった場合、自動的にデフォルトコンストラクターが生成されます。
  • コンストラクターは入出力処理ではなく、初期化を行うために使用されます。
  • new演算子などを利用して、実行時にメモリを確保するために使われます。
  • virtualやstaticとして宣言することはできません。
  • 複数のコンストラクターを宣言することが可能です(オーバーロードに対応)。

C++における「struct」コンストラクターの構文

まず、構造体コンストラクターの一般的な構文を確認しましょう。

struct StructureName{
d_type variable1;
d_type variable2;
........
........

// 引数なしコンストラクター
StructureName()
{
// 処理内容
}

// 引数ありコンストラクター
StructureName(d_type variable1, d_type variable2,..)
{
// 処理内容
}

};

上記の構文における各要素の意味は以下の通りです。

  • StructureName」には任意の構造体名を指定し、「struct」キーワードで定義します。
  • d_type variable1」は、さまざまなデータ型を持つメンバー変数を表します。
  • 続く「StructureName()」は、引数を取らないコンストラクターです。
  • さらに「StructureName(d_type variable1,…)」のように記述すれば、引数を受け取るパラメータ化コンストラクターも定義できます。

補足: 「struct」の宣言方法は、C++におけるクラスの宣言とほぼ同じです。

C++における「struct」コンストラクターの仕組み

C++では、用途に応じて引数なし・引数ありどちらの構造体コンストラクターでも自由に使えます。以下のコード例を通じて、具体的な動作を見ていきましょう。

C++でデフォルトの「struct」コンストラクターを作成する

C++でデフォルトの構造体コンストラクターを作成するには、次のコードブロックをご覧ください。

#include <iostream>
using namespace std;

struct folk{
   string name;
   float height;
   int age;

folk(){
   name= "David";
   height = 6.7;
   age = 26;
   cout<<"Name: "<<name<<endl<<"Height: "<<height<<endl<<"Age: "<<age<<endl;
    }
};

int main()
{
   folk();
}

上記のコードブロックでは、以下のような処理を行っています。

  • 最初に、ヘッダーファイルとして入出力ストリームライブラリの「#include <iostream>」を追加しています。
  • 次に、「using namespace std」を宣言して、標準ライブラリの識別子をそのまま使えるようにしています。
  • その後、3つの異なるデータ型のメンバーを持つ「folk()」構造体を作成しました。それぞれ「name」はstring型、「height」はfloat型、「age」はint型です。
  • 続けて、構造体にコンストラクターを追加し、各メンバーを対応する値で初期化しています。コンストラクターの本体ではfolk構造体のデータを設定し、「cout」ステートメントによって結果をコンソールに出力しています。

出力結果:
Name: David
Height: 6.7
Age: 26

C++で引数付きの「struct」コンストラクターを作成する

引数付きのコンストラクターを作成したい場合は、以下のコードを試してみてください。

#include <iostream>
using namespace std;

struct folk{
   string name;
   float height;
   int age;

folk(string x, float y, int z){
   name = x;
   height = y;
   age = z;
   }
};

int main()
{
    folk f1("Ayzel", 5.1, 23);
    cout<<"Name: " <<f1.name<<endl<<"Height: "<<f1.height<<endl<<"Age: "<<f1.age<<endl;
}

ここでのポイントは以下の通りです。

  • 前述の例を拡張し、変数とそれぞれのデータ型をコンストラクターの引数として渡しています。具体的には「x」がstring型、「y」がfloat型、「z」がint型です。
  • 最後に、「main()」関数の中で「f1」というオブジェクトを生成し、実際の値を渡してコンストラクターを呼び出しています。その後、「cout」ステートメントで各変数の結果をコンソールに出力しています。

出力結果:

【C++】構造体のコンストラクターとは?目的・構文・使い方を徹底解説

C++で構造体のポインターを作成する方法

ポインターとは、オブジェクトのメモリアドレスを格納するために使われる変数です。C++では、配列の要素を順に処理したり、他のデータ構造を走査したりするなど、さまざまな場面でポインターが活用されます。構造体のようなユーザー定義型に対しても、ポインター変数を作成することが可能です。以下の例で、構造体へのポインターの作成方法を確認してみましょう。

#include <iostream>
#include <cstring>
using namespace std;

struct folk
{
  string name;
  int age;
};

int main(){
      struct folk f = {"Elice ", 28};
      struct folk *ptr;
      ptr = &f;
      cout << f.name << f.age << endl;
   cout << ptr->name << ptr->age << endl;
   return 0;
}

上記コードの内容は以下の通りです。

  • <iostream>」と「<cstring>」のヘッダーファイルを追加しました。
  • 次に、「using namespace std」を指定して、標準ライブラリの識別子を利用できるようにしています。
  • その後、2つの異なるデータ型のメンバーを持つ「folk()」構造体を作成しました。それぞれ「name」はstring型、「age」はint型です。
  • 続いて、「folk」構造体へのポインター「ptr」を定義しました。
  • そして、構造体変数「f」を指すようにポインター「ptr」を設定しています。これにより、「ptr」には構造体変数「f」のアドレスが格納されます。
  • 最後に、「->」演算子を使うことで、ポインター経由で構造体のデータメンバーへアクセスしています。

上記コードの出力結果は以下の通りです。

【C++】構造体のコンストラクターとは?目的・構文・使い方を徹底解説

まとめ

C++における「struct(構造体)」は、メンバー変数を初期化するための特別なメンバー関数であるコンストラクターを持ち、異なるデータ型を混在させた変数群をひとつの場所でまとめて定義できる便利な機能です。コンストラクターは引数なし・引数ありのどちらの形式でも定義でき、さらに構造体のようなユーザー定義型に対してポインター変数を作成することもできます。この記事では、C++の構造体コンストラクターについて、基本から応用まで詳しく解説しました。

著者について

【C++】構造体のコンストラクターとは?目的・構文・使い方を徹底解説

Maria Naz

コンピューターサイエンスの修士号を保有しています。新しい技術の探求やプログラミング言語の学習に情熱を注ぎ、得た知識を世界中の人々と共有することを心がけています。


  1. 【C++】配列内のすべての素数の積を求める方法

    整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の

  2. C++でN分木(N-aryツリー)を二分木にエンコード・デコードする方法

    N分木(N-ary tree)を1本の二分木へ変換(エンコード)することを考えてみましょう。あわせて、エンコード済みの二分木を元のN分木へ復元(デコード)する機能も実装します。 たとえば、次のような入力が与えられたとします。 このとき、出力は次のようになります。 解法のアプローチ:左子・右兄弟表現 この問題は「左子・右兄弟表現(Left-Child Right-Sibling Representation)」と呼ばれる古典的な手法で解くことができます。考え方はシンプルで、N分木の最初の子を二分木の左の子に対応させ、2番目以降の兄弟ノードを順番に右の子として連結していきます。これにより、任