C ++ - constキーワード

 

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

おすすめ

転載: www.cnblogs.com/jg01/p/12400227.html