c++のconstオブジェクトとconstメンバー関数

4710 ワード

c++のconstオブジェクトとconstメンバー関数
一部のメンバー関数はオブジェクトを変更し、一部のメンバー関数はオブジェクトを変更しません.例:int Point::GetY(){
  return yVal;
}

この関数が呼び出されると、ポイントオブジェクトは変更されず、次の関数はポイントオブジェクトを変更します:void Point::SetPt(int x,int y){
xVal=x;
yVal=y;}
メンバー関数の意味をより明確にするために、オブジェクトを変更しないメンバー関数の関数プロトタイプにconstの説明を加えることができます.
class Point{
  public:
    int GetX() const;
    int GetY() const;
    void SetPt (int, int);
    void OffsetPt (int, int);
  private:
    int xVal, yVal;

}; constメンバー関数は、関数のプロトタイプ説明と関数定義にconst制限を追加する必要があります.
   int Point::GetY() const
{
  return yVal;
}
class Set {
public:
  Set (void){ card = 0; }
  bool Member(const int) const;
  void AddElem(const int);
  //...
};
bool Set::Member (const int elem) const

{//...
}
                    ,             
   :

const Set s; s.AddElem(10);//不正:AddElemは定数メンバー関数s.Member(10);//このルールの例外は、定数メンバーとして定義されていませんが、コンストラクション関数とコンストラクション関数です.
定数オブジェクトによって呼び出されます(自動呼び出されます).また、データ・メンバー自体が定数でない限り、定数のデータ・メンバーに値を割り当てることもできます.なぜconstメンバー関数が必要ですか?
定義したクラスのメンバー関数には、クラスのデータ・メンバーを変更しないメンバー関数がよくあります.つまり、これらの関数は読み取り専用関数であり、クラスのデータ・メンバーの値を変更する関数もあります.データメンバーを変更しない関数にconstキーワードを付けて識別すると,プログラムの可読性が向上することは明らかである.実際には、プログラムの信頼性も向上し、constのメンバー関数として定義されており、データ・メンバーの値を変更しようとすると、コンパイラはエラーで処理されます.
constメンバー関数とconstオブジェクトは、実際には、constメンバー関数には定数オブジェクト相関というもう一つの役割があります.組み込み
     ,           ,          ,     
      。  ,            :

const int i=1 ; 同様に、クラスclassAがあると仮定して、クラスの定数オブジェクトを定義する方法は次のようになります.
const classA a(2);
ここで、aはクラスclassAのconstオブジェクトであり、「2」はその構造関数パラメータに渡される.constオブジェクトのデータメンバーは、オブジェクトの寿命期間内に変更できません.しかし、このクラスのデータメンバーが変更されないことをどのように保証しますか?
constオブジェクトのデータメンバーが変更されないようにするには、C++でconstオブジェクトはconstメンバー関数のみを呼び出すことができます.メンバー関数が実際にデータ・メンバーを変更していない場合、constキーによって限定されていない場合、定数オブジェクトによって呼び出されません.この問題を例に挙げて説明します.
class C{
  int X;
public:

int GetX(){
return X;}
  void SetX(int X)
  {

this->X = X;}
};
void main()
{
  const C constC;
  cout<<constC.GetX();
}

上記のプログラムコードをコンパイルすると、コンパイラはconstCが定数オブジェクトであり、constメンバー関数しか呼び出せないというエラーメッセージが表示されます.GetX()関数は実際にはデータメンバーXを変更していないが、constキーワード限定がないため、constCオブジェクトに呼び出されない.上記の太字コードを使用すると、次のようになります.
int GetX()を次のように書き換えます.
int GetX()constを再コンパイルすれば問題ありません.constメンバー関数の使用
constメンバー関数は、クラスデータメンバーのみを読み取ることができ、クラスメンバーデータを変更することはできません.constメンバー関数を定義する場合は、constキーワードを関数のパラメータテーブルと関数体の間に置きます.なぜconstを関数宣言の前に置かないのかと聞かれるかもしれません.これは関数の戻り値が定数であることを意味し,意味が全く異なるからである.次にconstメンバー関数を定義する例を示します.
class X{
      int i;
      public:
      int f() const;

};
キーワードconstは同じ方法で関数実装に繰り返し表示されなければなりません.そうしないと、コンパイラはそれを異なる関数と見なします.
    int X::f() const
    {

return i;}
f()がiを任意の方法で変更したり、別の非constメンバー関数を呼び出したりしようとすると、コンパイラはエラー情報を与えます.メンバーデータを変更しない関数はconst関数として宣言する必要があります.これにより、プログラムの可読性と信頼性が向上します.
オブジェクトメンバー関数
オブジェクトメンバー関数の間違い
const constペア
const non-constエラー
non-const constペア
non-const non-constペア
メンバー関数呼び出しメンバー関数
メンバー関数メンバー関数の間違い
const constペア
const non-constエラー
non-const constペア
non-const non-constペア