定数(constと#defineの違い)
6645 ワード
なぜ定数が必要なのかプログラムの可読性(理解性)が悪くなる.プログラマー自身は、数字や文字列がどういう意味なのかを忘れ、ユーザーはどこから来たのか、何を表しているのかをさらに知りません. プログラムの多くの場所で同じ数字や文字列を入力し、書き間違えが発生しないことは保証できません. 数字や文字列を変更する場合は、多くの場所で変更され、面倒でエラーが発生しやすい. 定数は、コード全体でこの量を変更できないことを望んでいるので、constで修飾すると より良いです.
Cでは定数を定義するのが一般的ですが、C++ではconstで定数を定義します
constと#defineの比較
C++においても、#defineで定数を定義することは可能であるが、C++ではマクロ定数ではなくconstで定数を定義するだけである.すなわち、const定数がマクロ定数に完全に取って代わる#defineはマクロ定義であり、プログラムは前処理段階で#defineで定義された内容に置き換えられる.したがって、プログラムが実行されると、定数テーブルには#defineで定義された定数はなく、メモリは割り当てられません.constで定義された定数.プログラムの実行時に定数テーブルにメモリを割り当てます.#defineのマクロ定数は、メモリを割り当てずに前処理段階で置き換えられます.一方constが定義する定数は、定数記憶領域に が割り当てられる.#defineで定義された定数は、前処理時に直接置換されただけです.したがって、コンパイル時にデータ型検査を行うことはできません.const定義の定数は、コンパイル時に厳格なタイプチェックを行い、エラーを避けることができます.const定義定数、タイプチェック #define式を定義するときは、エッジ効果に注意してください.例えば、
const定義の定数を常変数と呼ぶ理由は2つあります.const定義定数は変数のようにタイプをチェックします.constは任意の場所で定数を定義できます.コンパイラの処理は変数と似ていますが、メモリを割り当てる場所が異なるだけです(const定数割り当てメモリは定数ストレージ領域にあります).
クラス内の定数
いくつかの定数がクラスでのみ有効であることを望む場合があります.#defineで定義されたマクロ定数はグローバルであり,目的を達成できないため,const修飾データメンバーで実現すべきであると考えるのは当然である.constデータ・メンバーは、オブジェクトの生存期間内にのみ定数であり、クラス全体に対して可変です.クラスは複数のオブジェクトを作成でき、異なるオブジェクトはconstデータ・メンバーの値が異なるためです.
クラス宣言でconstデータメンバーを初期化できません.
クラスのオブジェクトが作成されていない場合、コンパイラはSIZEの値が何であるか分からないため、以下の使い方は間違っています.
constデータ・メンバーの初期化は、クラス構造関数の初期化テーブルでのみ実行できます.たとえば、
クラス全体で一定の定数を確立するにはどうすればいいですか?constデータメンバーを期待しないで、クラスの列挙定数で実現するべきです.たとえば
列挙定数は、オブジェクトのストレージ領域を占有せず、コンパイル時にすべて評価されます.列挙定数の欠点は、隠しデータ型が整数であり、最大値が限られており、浮動小数点数(例えばPI=3.14159)を表すことができないことです.
Cでは定数を定義するのが一般的ですが、C++ではconstで定数を定義します
#define MAX 100 /* C */
const int MAX = 100; // C++ const
const float PI = 3.14159; // C++ const
constと#defineの比較
C++においても、#defineで定数を定義することは可能であるが、C++ではマクロ定数ではなくconstで定数を定義するだけである.すなわち、const定数がマクロ定数に完全に取って代わる
#define N 2+3 // ,#define , ,
int a = N/2;
// 2+3/2, , 3
// “ ”
// N = 5,
// #define N (2+3)
// , const, ,const
const int M = 2 + 3;
// ,M M = 5
const定義の定数を常変数と呼ぶ理由は2つあります.const定義定数は変数のようにタイプをチェックします.constは任意の場所で定数を定義できます.コンパイラの処理は変数と似ていますが、メモリを割り当てる場所が異なるだけです(const定数割り当てメモリは定数ストレージ領域にあります).
クラス内の定数
いくつかの定数がクラスでのみ有効であることを望む場合があります.#defineで定義されたマクロ定数はグローバルであり,目的を達成できないため,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
クラス全体で一定の定数を確立するにはどうすればいいですか?constデータメンバーを期待しないで、クラスの列挙定数で実現するべきです.たとえば
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; //
int array1[SIZE1];
int array2[SIZE2];
};
列挙定数は、オブジェクトのストレージ領域を占有せず、コンパイル時にすべて評価されます.列挙定数の欠点は、隠しデータ型が整数であり、最大値が限られており、浮動小数点数(例えばPI=3.14159)を表すことができないことです.