CONST変数は、割り当てられた後は、変更することはできません
もしソースコード、CONST変数が変更され、コンパイラエラー「L値を指定constオブジェクト」
(A)ポインタ定数面質問VS定数ポインタ[2-7]
1 の#include <stdio.hの> 2 3 INT メイン() 4 { 5 のconst int型のx = 1 。 6 INT B = 10 。 7 INT C = 20 。 8 9 CONST INT * A1 =&B。 10 のint * constの A2 =&B; 11 のconst int型 * constの A3 =&B; 12 13 X = 2 。 !//間違ったライン5のconst int型のx = 1つのに変更することはできません割り当て 14 15 A1 =& C; ...右のラインが変更する可能性自体A1、* A1、* A1のint型のconstに変更された// 9 16 * = A1を 1。; // * A1が間違っCONSTであり、誤差値を指定constオブジェクト-Lを変更することはできません! 17。 18である A2 =& C; // constの間違ったライン10の変形例A2、A2は、CONSTで変更することができないで! 19。 * = A2 1。; //右* a2は、INT型で修正することができる。 20 21 、A3 =& C; * A3およびA3における//間違ったライン11はCONST、変更することはできませんされています! 22 * A3 = 1 ; * A3、A3の中に//間違った11行目までにconst、変更することはできませんされています! 23 24 戻り 0 ; 25 }
特性との差の(ii)の説明[2-8]のCONST顔質問を#defineします
(2.1)の#define
1つ の#define PI 3.1415926 2 フロート天使。3天使= 30 * PI / 180。
#define:すべての事前コンパイル手順の間、PIは、その後、コンパイル済みの「3.1415926」を置き換えます。
#define定数は、それがコードセグメントと手順を持っているので、「コンパイル時」のコンセプトである、それは本当に実際の運用では感知しませんでした
(2.2)CONST
CONST変数は、プログラムのデータセグメント内に存在し、割り当てられたスペースを前方に取ります。
constが定数「実行時間」という概念です。それは本当に、実際に存在し、プログラムに渡して、呼び出すことができます。
constのデータ型は、#には、データ型を定義していません。
コンパイラは、一定のセキュリティチェックconst型を実行することができます。
(C)C ++のconstでどのような役割?[2-9]フェイス質問
(1)の定数を定義するためのCONST、CONST定数が定義され、コンパイラは、静的な型の安全性データであってもよいです
(2)CONSTパラメータは関数形を修飾:カスタムデータ型の種類及び要約は、それはCONSTと送信されたアドレス 'にユーザ入力パラメータとして「値を渡す」でなければならない場合、効率を向上させることができます。
1つ のボイド楽しい(A); 2 、ボイド楽しい(A のconst&A)。
上記のコードは、効率は「参照渡し」必要が一時変数を生成するため、何ら構造、複製、デストラクタがない、2行目1行目よりも高くなります。しかし、A&参照光は、そう標識CONSTを変更することができます
唯一の同じタイプの戻り値CONST変数の修飾に割り当てることが必要ながら、(3)CONSTは、値を変更することができない修飾関数戻り値を返し
1の#include <stdio.hの> 2 のconst int型ファン(){ リターン 1 ;} 3。 INT メイン(){ 4。 CONST INT M = ファン(); // constがCONST変数戻ると、関数の戻り値を受信 5。 復帰 0 ; 6 }
(4)メンバ関数CONST修飾クラスは:誤ってデータメンバを変更したり、非constメンバ関数を呼び出すと、コンパイラはエラーを報告するように、機能が変更された任意のデータアプリケーションのconstメンバを変更しません。修飾されたクラスの形式のconstメンバ関数
int型 GetCountの(...)のconst ;
[注]上記式のconst int型GetCountの(...)は、異なる、CONST INT GetCountの(...)の戻り値がint定数で表し
[実施例]
1 クラスの学生{ 2 公共: 3 学生(文字 *名、int型の年齢、フロートスコア); 4 ボイドショー(); 5 のchar *のgetName()CONST 。 6 INT getage()CONST 。 7 フロート getscore()CONST 。 8 プライベート: 9 のchar * M_NAME。 10 INT m_age。 11 フロートm_score。 12 }。 13 14学生::学生(CHAR *名、int型の年齢、フロートスコア):M_NAME(名)、m_age(年齢)、m_score(スコア){} 15 、ボイド学生::ショー(){ 16 coutの<< M_NAME << " 年齢は、 " << m_age << " のスコアが「 << m_score << てendl; 17 } 18 のchar *スチューデント::のgetName()のconst { 戻りM_NAME;} 19 INT学生:: getage()のconst { 戻りm_age;} 20 フロート学生::CONST { 戻り m_score;}
定義および実装するクラスのconstメンバ関数を[注]関数ヘッダの終了プラスconstキーワードで同時に要求されています。CHAR *のgetName()constはCHARに*のgetName()関数のプロトタイプは、2つの異なる、唯一の1位、プラスconstがで関数プロトタイプと生活の競合の定義が発生した場合。
(5)constメンバ変数を初期化する唯一の方法は、初期化リストを使用することです
1 クラスVLA { //正しいバージョン 2 プライベート: 3 のconst int型m_len; 4。 INT * m_arr; 5。 公共: 6 VLA(INT LEN); 7 }; 8は // m_len初期化リストを使用して初期化されなければならない 。9 VLA VLA :: (INT LEN):{(LEN)m_len 10 m_array = 新しい新しい INT [LEN]; 11 }
クラスVLA { //間違ったバージョン プライベート: のconst int型m_len; int型 * m_arr; 公共: VLA(int型のlen); }; VLA VLA ::(int型のlen){ m_len = LEN; それはm_lenない// int型のconst初期 m_arr = 新しい新しい INT [LEN]; }
リファレンス(参照)
[1] CおよびC ++プログラマのインタビューのヒント - 最も一般的なC / C ++インタビューZhentiの選択:東山海
[2] http://c.biancheng.net/view/2230.html
[3] http://c.biancheng.net/view/2223.html