1. コンストラクターの紹介
以下で宣言した日付クラスを観察すると、Init 関数を呼び出してメンバー変数を初期化できますが、初期化するたびに繰り返し呼び出す必要があるため、コードを簡素化するためにコンストラクターが導入されています。
class Date
{
public:
void Init(int day, int month, int year)
{
_day = day;
_month = month;
_year = year;
}
private:
int _day;
int _month;
int _year;
};
2. コンストラクター
1. コンストラクターの概要
コンストラクターは、クラスと同じ名前を持つ特別なメンバー関数です。コンストラクターは、クラス型オブジェクトの作成時にコンパイラによって自動的に呼び出され、各データ メンバーが適切な初期値を持つようにし、コンストラクターのライフ サイクル全体で 1 回だけ呼び出されます。オブジェクトです。
コンストラクターの名前には「construct」という単語が含まれていますが、オブジェクトを作成するためのスペースを開くのではなく、オブジェクトの作成中にメンバー変数を初期化します。
2. コンストラクターの特徴
- コンストラクタの構文
1. 名前はクラス名と同じです
2. 戻り値の型はありません
class Date
{
Date()//可以含有参数
{
}
};
- コンパイラは、オブジェクトがインスタンス化されるときに、対応するコンストラクターを自動的に呼び出します。
- コンストラクターはオーバーロードできる
#include <iostream>
using namespace std;
class Date
{
public:
Date()
{
cout << "Date()" << endl;
}
Date(int day, int month, int year)
{
cout << "Date(int day,int month,int year)" << endl;
}
private:
int _day;
int _month;
int _year;
};
int main()
{
Date a;//调用无参数的构造函数
Date b(1, 2, 3);//调用有参数的构造函数
//注意调用无参构造时不要在对象后面加括号
//如Date c();编译器不认为这是在创建对象,而是认为这是一个函数名为c,
//返回值为Date类型,无参的一个函数声明
return 0;
}
上記 2 つのオブジェクトが初期化されると、出力結果は次のようになります。
- クラス内に明示的に定義されたコンストラクターがない場合、C++ コンパイラーはパラメーターのないデフォルトのコンストラクターを自動的に生成しますが、ユーザーが明示的に定義すると、コンパイラーはそれを生成しなくなります。
デフォルト コンストラクター: コンパイラーによって自動的に生成されたコンストラクター、プログラマーによって定義されたパラメーターのないコンストラクター、およびすべてのデフォルト パラメーターを持つコンストラクターはデフォルト コンストラクターと呼ばれ、デフォルト コンストラクターは 1 つだけです。
#include <iostream>
using namespace std;
class Date
{
public:
/*Date(int day, int month, int year)
{
cout << "Date(int day,int month,int year)" << endl;
}*/
private:
int _day;
int _month;
int _year;
};
int main()
{
Date a;//此时创建对象编译器不会报错,因为编译器会自动生成一个构造函数;
//但把上面的注释打开就会报错,因为我们显式的声明了一个构造函数
//编译器不再生成默认构造函数
return 0;
}
- 自分でコンストラクタを宣言しない場合は、コンパイラが自動でコンストラクタを生成しますが、コンパイラが生成したコンストラクタを呼び出すと、先ほど述べたdateクラスの3つのメンバ変数がランダムな値を取得し、コンパイラが生成します。コンストラクターの用途は何ですか?
回答: C++ では、変数の型を組み込み型とカスタム型に分けます。組み込み型は、言語によって提供される int/char... などのデータ型であり、カスタム型は、class/struct を使用して自分で定義する型です。次のプログラムでは、コンパイラーがカスタム型メンバーのデフォルトのメンバー関数を呼び出すデフォルトのコンストラクターを生成していることがわかります。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class Time
{
public:
Time()
{
cout << "Time()" << endl;
}
private:
int time;
};
class Date
{
private:
int _day;
int _month;
int _year;
Time _t;
};
int main()
{
Date b;//对b中的变量_t初始化时调用的是Time的构造函数
return 0;
}
出力された結果は次のとおりです。
組み込み変数を初期化できないという欠陥を補うために、C++11 ではパッチが追加されました: 組み込み型メンバー変数には宣言時にデフォルト値を与えることができ
ますクラスで。次のように:
class Date
{
private:
int _day = 2;//给默认值
int _month = 3;
int _year = 4;
};
要約する
この記事では主に C++ のコンストラクターに関する知識を紹介しますが、同時に C++ コラムも随時更新していきますので、お役に立てれば幸いです。