定数データメンバーの使用と初期化
定数の概念は C 言語を学ぶときにすでに知っていますが、いわゆる「定数」、または「定数」で修飾された変数は定数変数になります。この値は変更できません。
C++ には定数の概念もあります。さらに異なる点は、const を使用して一般変数を定数変数に変更するだけでなく、オブジェクトを変更して定数オブジェクトに変えることもできることです。また、クラスを変更できるデータメンバとメンバ関数を、それぞれクラスの定数データメンバと定数メンバ関数と呼びます。
次に、定数データメンバー、定数メンバー関数、定数オブジェクトについて順に説明します。
1. 定数データメンバー:
定数データ メンバーの使用法は、データのこの部分がクラス内に表示され、使用される形式が次のとおりであることを除いて、C 言語での使用法と同じです。
データ型 const データ メンバー名。
または
const データ型のデータメンバー名。
const によって変更されるメンバーは初期化する必要があり、変更することはできません。初期化メソッドはクラスのコンストラクターの初期化リストで実行されます。
さらに、特殊なケースがあり、メンバーが静的型、つまり静的定数データ メンバーの場合は、静的属性であるため、初期化をクラスの外部で初期化する必要があります。説明するために、今述べた状況をコードに入れてみましょう。
#include<iostream>usingnamespacestd;classClock{private:constinth;//h を定数型メンバーとして変更する constintm;//m を定数型メンバー intconsts として変更する;//上記 2 つの使用法の両方を使用できます staticconstintx;public:Clock (inta, intb,intc):h(a),m(b),s(c){cout<<Constrctor!Called<<endl;}intShowTime(){cout<<h<<:<<m<< :<< s<<endl;return0;}intGetX(){cout<<x<<endl;return0;}};constintClock::x=99;intmain(){ClockA(12,10,30);A. ShowTime() ;A.GetX();return0;}
デモ結果を実行します。
クラス内の 4 つの定数データ メンバーに注意してください。このうち、X は静的型であるため、たとえ X がプライベート型であっても、クラスの外で初期化する必要があります。
2. 定数オブジェクト:
C++ では、オブジェクトは const 型、つまり定数オブジェクトとして宣言できます。この宣言の後、オブジェクトはライフサイクル全体にわたって変更できないため、定義時にコンストラクターによって初期化する必要があります。定義形式は次のとおりです。
const オブジェクト名を入力します。
または
const 型のオブジェクト名。
定数オブジェクトはクラス内の非メンバー関数にはアクセスできませんが、定数メンバー関数のみにアクセスできることに注意してください (下記のパート 3)。以下の例を見てみましょう。
#include<iostream>usingnamespacestd;classClock{private:constinth;// h を定数型のメンバーになるように変更します constintm;// m を定数型のメンバーになるように変更します intconsts;// 上記 2 つの使用法は両方とも可能です intx;public: Clock(inta, intb,intc):h(a),m(b),s(c){x=99;cout<<Constrctor!Called<<endl;}intShowTime(){cout<<h<<: <<m< <:<<s<<endl;return0;}intGetX()const{//x=99;cout<<x<<endl;return0;}};intmain(){constClockA(12,10, 30);constClockB (14,20,50);//A=B;//A.ShowTime();A.GetX();return0;}
コードの 39 行目と 40 行目のステートメントに注意してください。A は定数オブジェクトで値を割り当てることができず、ShowTime 関数は非メンバー関数であるため、通常のコンパイルではエラーが報告されます。 41 行のコードを実行すると、次のような効果が得られます。
3. 定数メンバー関数:
同様に、クラス内のメンバー関数が const によって変更されると、定数メンバー関数になります。定数メンバー関数の定義は次のとおりです。
戻り値の型 関数名(パラメータリスト列) const;
次の点に注意する必要があります。
(1) 定数メンバー関数の定義と宣言には const が含まれている必要があります。
(2) 定数メンバ関数は定数メンバ関数のみを呼び出すことができますが、特殊メンバ関数を呼び出すことはできません。また、特殊メンバ変数にはアクセスできませんが変更することはできません。
たとえば、次のコード:
#include<iostream>usingnamespacestd;classClock{private:constinth;// h を定数型のメンバーになるように変更します constintm;// m を定数型のメンバーになるように変更します intconsts;// 上記 2 つの使用法は両方とも可能です intx;public: Clock(inta, intb,intc):h(a),m(b),s(c){x=99;cout<<Constrctor!Called<<endl;}intShowTime(){cout<<h<<: <<m< <:<<s<<endl;return0;}intGetX()const{//x=99;cout<<x<<endl;return0;}};intmain(){constClockA(12,10, 30);A .GetX();return0;}
コードの 29 行目と 30 行目に注意してください。コードの 29 行目を使用すると、実際の実行結果は次のようになります。
C++ で定数の概念が確立されると、プログラム内の各オブジェクトの変更と不変の境界が明確になり、C++ プログラムの安全性と制御性も向上します。
ぜひご自身で試してみてください。