4.1.constの役割
(1)定数を定義
(2)型チェックを容易にします
CONST定数データ型変更、ないマクロ定数、定数const型の安全性チェックを行うことができ、このステップが存在しないことは、例外エラーが発生することがあります。
(3)何かを保護するために変更することができます
不慮の変更を防ぎます。
(4)容易に変更可能なパラメータ
(5)過負荷のための基準を提供します
1 クラスA {
2 空隙FUNC(){};
3 // オーバーロードFUNC()constの後の括弧内に、非メンバ関数を使用することを許可されていない
4。 ボイド FUNC()のconst {};
5 }。
(6)のスペースを節約するために
CONSTは、メモリアドレス、コピーを1つだけ実行する処理を所定の定数を定義し、メモリ内のマクロ定義複数のコピー。
(7)効率を向上させます
コンパイラがコンパイル時に通常のCONST変数の記憶が、シンボル・テーブルの存在、及びメモリ読み出し及び記憶動作を割り当てない、効率が向上します。
4.2.const使用
あなたが共有したい場合は(1)デフォルトでは、constのオブジェクトがにexternキーワードを使用して、複数のファイルで、ファイルで効果的に行います!
(2)const参照
1 INT I = 5 ;
2 // 多量に結合させる
。3 のconst int型&R_1 = I;
4は // リテラルに結合させる
。5 のconst int型&R_2 = 10 ;
図6を // double型に結合させ参照
7。 CONST ダブル&R_3 = I;
8は // 演算式と等号の右のを可能にする
。9 のconst int型&r_4 =私は+ 5 ;
10 CONST ダブル Iが+ r_5 = 5。 ;
別の種類に何が起こったのかを結合定数の参照?
5行目はリテラル定数にバインドされている場合たとえば、コンパイラがやっています:
1つの int型温度= 10 。
2 のconst int型&R_2 =温度;
結合R_2が一時オブジェクトであるように、まずリテラルの、一時的なオブジェクトに格納されています。C ++プライマー第五は、P62-ページを説明した理由、上記のコードの5行目は、この中に間違っているかどう修正のconstない理由、修飾constあいまいな役割が実際にあることを指摘され、この間接的な参照は変更されないことを示していますオブジェクト参照は、以下に説明します。
1 INT I = 5 ;
2 // 多量に結合させる
。3 のconst int型&R_1 = I;
4 // オブジェクト&R_1変更の結合値によって許容される誤差
5。 &R_1 ++ ;
6つの // 適切に使用されるオブジェクト自身の操作
。7 I ++;
(3)及びポインタCONST
定数ポインタ:
1 double p = 3.14;
2 double p1 = 3.15;
3 //允许将一个普通变量取地址赋值给一个指向常量的指针,反之,不允许一个将一个常量取地址赋值给一个普通指针
4 double const *p_1 = &p;
5 double const *p_2 = &p1;
6 //正确,允许改变指针所指向的地址(改变指针本身)。
7 p_1 = p_2;
8 //错误,不允许改变指针所指地址存储的值
9 *p_1 = 50;
10 cout << *p_1;
11
常量指针:
double pi = 3.14;
double pi_1 = 3.16;
//不能够把一个常量取地址赋值给一个指针常量,因为显然等号右侧应该是一个可变的值
double * const pip = π
//允许通过指针修改所指向地址存储的值
*pip = 3.15;
//错误,不允许修改指针常量中指针本身
pip = &pi_1;
如何阅读一个定义?
在不带有数组的情况下,先读()的内容,然后从左往右读。比如说,double const *p_1 = &p; 先找到标识符p_1从左往右:*修饰,表明其首先为一个指针,然后是const修饰,说明这个指针所指的对象是一个常量,然后是基本类型符double,于是我们可以知道,这一条语句的定义理解为:我们定义了一个指向常量的指针p_1。
顶层const和底层const:
顶层const:表示指针本身是个常量,定义可以延申。
底层const:表示指针所指对象是一个常量,定义可以延申。
(4)const应用于函数
作为函数的形参:
1 //传递过来的参数在函数内不可以改变
2 void function(const int Var);
3 //参数指针所指内容为常量不可变
4 void function(const char* Var);
5 //参数指针本身为常量不可变
6 void function(char* const Var);
7 //引用参数在函数内不可以改变
8 void function(const int& Var);
修饰函数返回值:
1 //函数返回值不能作为左值
2 const int func();
3 //把function()看作一个变量,那么指针所指地址的对应的内容不可改变
4 const int * function();
5 //把function1()看作一个变量,那么指针本身不可以改变
6 int * const function1();
函数的返回值不能作为左值这一点,在操作符重载中有所体现,比如说,避免了等号左边出现表达式的情况。const引用做形参和返回值在这里不再赘述,留下来自己思考!
(5)类成员中的const
修饰类的变量:
1 class Test {
2 public:
3 //错误,const修饰的成员变量只能在初始化列表中赋初始值
4 Test(int i) {
5 value = i;
6 };
7 //正确
8 Test(int i) :value(i) {};
9 private:
10 const int value;
11 };
修饰成员函数:
(6)
(7)
(8)
(9)
(10)