データフィールドのカプセル化
最初に、前のクラス定義コードのセクションを置きます。
#ifndef CIRCLE_H #define CIRCLE_H class Circle { public : // 円の半径double radius; // パラメータコンストラクタなし Circle(); // パラメータコンストラクタ Circle(double ); // 円の面積を取得するdouble getArea() ; }; #endif
すべてのデータフィールドと関数を公開する前に。パブリックとは、パブリック、つまり誰でもこれらのデータと機能にアクセスできることを意味します。
たとえば、円オブジェクトc1の半径を変更する場合は、radiusに直接アクセスして変更できます。
c1.radius = 2 ;
しかし、このスタイルは良くありません。具体的なパフォーマンスは次のとおりです。
- データが乱れる可能性があります。関数がクラスの属性を使用したいとします。ただし、このカプセル化されていないプロパティは変更できます。これにより、関数が異なる結果を実行することがあります。
- メンテナンスが容易ではありません。円の半径は0より大きくなければなりませんが、データがカプセル化されておらず、直接変更できる場合、この条件を満たすことはできません。
データをカプセル化する必要があり、関数は通常カプセル化されません。
カプセル化を表すキーワードはプライベートであり、パブリックと同様です。プライベートデータまたは関数には、クラス内でのみアクセスできます。この時点で直接アクセスすると、コンパイラからエラーが報告されます。以下のコードを参照してください。
#ifndef CIRCLE_H #define CIRCLE_H class Circle { private : // 円の半径double radius; public : // パラメータのないコンストラクタ Circle(); // パラメータ化されたコンストラクタ Circle(double ); // 円の領域double getArea (); // 円の半径を取得double getRadius(); // 円の半径を設定し、それが0より大きいかどうかを判断しますvoid setRadius(double newRadius); }; #endif
上記のコードでは、データ半径をカプセル化し、ゲッターメソッドとセッターメソッド、つまりgetRadius()とsetRadius(double newRadius)を提供しました。これらの2つのメソッドはそれぞれ、データの取得と変更を担当し、命名メソッドは通常、最初の文字を使用して2つの単語を区別するgetXxx()およびsetXxx()です。
getterメソッドはアクセサーのようなもので、setterはチェンジャーのようなものです。
すべてのデータがゲッターおよびセッターメソッドを必要とするわけではありません。状況によって異なります。
変数スコープ
プログラムの変数は、グローバル変数とローカル変数の2つのタイプに大別できます。
ローカル変数は関数内で定義され、そのスコープは関数に限定されます。コンパイラーは関数を終了した後にエラーを報告し、この変数を使用します。
グローバル変数は、関数の外部で定義された変数です。これはどの関数にも属さず、ソースプログラムファイルに属し、そのスコープはソースプログラム全体です。
変数スコープについては、次のブログを参照してください。
グローバル変数、ローカル変数、静的グローバル変数、静的ローカル変数の違い
クラスの変数もこれらの規則に準拠しています。
特に、データフィールドまたは関数が静的(つまり、静的データまたは関数)として宣言されている場合、データまたは関数は特定のオブジェクトインスタンスに属しておらず、このクラスに属しています。したがって、すべてのオブジェクトの静的データは同じです。