C++クラスメンバー定数

1951 ワード

#defineで定義されたマクロ定数はグローバルであり,目的を達成できないため,const修飾データメンバーで実現すべきであると考えるのは当然である.constデータメンバーは確かに存在しますが、その意味は私たちが望んでいるものではありません.constデータ・メンバーは、オブジェクトの生存期間内にのみ定数であり、クラス全体に対して可変です.クラスは複数のオブジェクトを作成でき、異なるオブジェクトはconstデータ・メンバーの値が異なるためです.クラス宣言でconstデータメンバーを初期化できません.クラスのオブジェクトが作成されていない場合、コンパイラはSIZEの値が何であるか分からないため、以下の使い方は間違っています. 
class A 

{

   const int SIZE = 100;   //   ,           const      

   int array[SIZE];  //   ,    SIZE 

}; 

constデータメンバーの初期化はクラス構造関数の初期化テーブルでのみ行われます.たとえば**変数は構造関数の関数体で初期化できます.
class A 

{

   A(int size);  //      

   const int SIZE ;    

}; 

A::A(int size) : SIZE(size)  //      

{ 



} 

A  a(100); //    a   SIZE    100 

A  b(200); //    b   SIZE    200 

クラス全体で一定の定数を確立するにはどうすればいいですか?以下に2つの方法を紹介する:1.クラス内の列挙定数で実現します.たとえば、
class A 

{

  enum { SIZE1 = 100, SIZE2 = 200}; //     

  int array1[SIZE1];  

  int array2[SIZE2]; 

}; 
は、オブジェクトの記憶領域を占有しない定数を列挙し、コンパイル時にすべて評価される.列挙定数の欠点は、隠しデータ型が整数であり、最大値が限られており、浮動小数点数(例えばPI=3.14159)を表すことができないことです.    2.キーワードstatic:
class A

{

 

   static const int SIZE=100;

 

   int array[SIZE];

 

}
を使用すると、オブジェクトに格納されるのではなく、他の静的変数とともに格納されるSIZEという定数が作成されます.したがって、この定数はクラス全体のすべてのオブジェクトで共有されます.注意:doubleタイプの定数は、整数または列挙された静的定数のみを宣言する技術では使用できません.floatとdoubleを申請するクラス定数方法:
// File A.h



class A{



 static const int ival= 400;    // value provided in declaration



 static const double dval;    // value provided in definition



 static const char* Name() {return "Xiaoshami"; }



};



 

// File A.cpp



const double A::dval= 66.67; // value provided in definition



const int A::ival;       // definition required
floatとdoubleタイプはクラスの外で定義しなければならないと言われていますが、私はc-freeでクラスの中で定義してもいいので、この投稿を見たいと思っています.変換元:http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125020.html