C ++-クラスとオブジェクトのデータフィールドは、グローバル変数、ローカル変数、静的グローバル変数、静的ローカル変数の違いをカプセル化します

データフィールドのカプセル化

最初に、前のクラス定義コードのセクションを置きます。

#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つのタイプに大別できます。

ローカル変数は関数内で定義され、そのスコープは関数に限定されます。コンパイラーは関数を終了した後にエラーを報告し、この変数を使用します。
グローバル変数は、関数の外部で定義された変数です。これはどの関数にも属さず、ソースプログラムファイルに属し、そのスコープはソースプログラム全体です。

変数スコープについては、次のブログを参照してください。

グローバル変数、ローカル変数、静的グローバル変数、静的ローカル変数の違い

クラスの変数もこれらの規則に準拠しています。

特に、データフィールドまたは関数が静的(つまり、静的データまたは関数)として宣言されている場合、データまたは関数は特定のオブジェクトインスタンスに属しておらず、このクラスに属しています。したがって、すべてのオブジェクトの静的データは同じです。

 

おすすめ

転載: www.cnblogs.com/bwjblogs/p/12686831.html