C++關于const與引用的分析講解
一、關于 const 的疑問
const 什么時候為只讀變量?什么時候是常量?
const 常量的判別準則
- 只有用字面量初始化的 const 常量才會進入符號表
- 使用其他變量初始化的 const 常量仍然是只讀變量
- 被 volatile 修飾的 const 常量不會進入符號表
注:在編譯期間不能直接確定初始值的 const 標識符,都被作為只讀變量處理。
const 引用的類型與初始化變量的類型 如果相同,則初始化變量成為只讀變量;如果不同 ,則生成一個新的只讀變量。
下面看一段 const 典型問題分析的代碼:
#include <stdio.h> int main() { const int x = 1; const int& rx = x; int& nrx = const_cast<int&>(rx); nrx = 5; printf("x = %d\n", x); printf("rx = %d\n", rx); printf("nrx = %d\n", nrx); printf("&x = %p\n", &x); printf("&rx = %p\n", &rx); printf("&nrx = %p\n", &nrx); volatile const int y = 2; int* p = const_cast<int*>(&y); *p = 6; printf("y = %d\n", y); printf("p = %p\n", p); const int z = y; p = const_cast<int*>(&z); *p = 7; printf("z = %d\n", z); printf("p = %p\n", p); char c = 'c'; char& rc = c; const int& trc = c; rc = 'a'; printf("c = %c\n", c); printf("rc = %c\n", rc); printf("trc = %c\n", trc); return 0; }
下面為輸出結果:
第一個需要注意的地方就是 使用字面量初始化的 const 常量才會進入符號表,所以打印出的x的值為1,而不是5。rx 代表的是 C++ 編譯器為 x 常量分配但是沒有使用的空間,為只讀變量。const_cast 消除了只讀變量的只讀屬性,所以得到的 nrx 為一個普通變量,且 nrx 也代表一個內存空間,這段內存空間與 rx 代表的內存空間為同一段。所以運行后 x,rx以及 nrx 所代表的的地址都是一樣。
第二個需要注意的地方就是被 volatile 修飾的 const 常量不會進入符號表,所以修飾的常量為只讀變量。const_cast 消除了 y 地址的只讀屬性,所以可以用一個普通指針 p 指向 y 的地址,所以改變 p 指針里面的內容,y 的值也會改變。
第三個需要注意的地方就是使用其他變量初始化的 const 常量仍然是只讀變量。所以令 const int z = y 后,依然可以使用指針改變 z 的值。
第四個需要注意的地方就是const 引用的類型與初始化變量的類型 如果相同,則初始化變量成為只讀變量;如果不同 ,則生成一個新的只讀變量。所以 trc 的值和上面的 c 和 rc不一樣。
二、關于引用的疑問
引用與指針有什么關系?如何理解“引用的本質就是指針常量”?
指針是一個變量
- 值為一個內存地址,不需要初始化,可以保存不同的地址
- 通過指針可以訪問對應內存地址中的值
- 指針可以被 const 修飾成為常量或者只讀變量
引用只是一個變量的新名字
- 對引用的操作(賦值,取地址等)都會傳遞到代表的變量上
- const 引用使其代表的變量具有只讀屬性
- 引用必須在定義時初始化,之后無法代表其它變量
從使用 C++ 語言的角度來看
- 引用與指針沒有任何的關系
- 引用是變量的新名字,操作引用就是操作對應的變量
從 C++ 編譯器的角度來看
- 為了支持新概念“引用”必須要一個有效的解決方案
- 在編譯器內部,使用指針常量來實現“引用”
- 因此“引用”在定義時必須初始化
在工程項目開發(fā)中
- 當進行 C++ 編程時,直接站在使用的角度看待引用,與指針毫無關系,引用就是變量的別名
- 當對 C++ 代碼進行調試分析時,一些特殊情況,可以考慮站在C++編譯器的角度看待引用
下面看一段引用典型問題分析:
#include <stdio.h> int a = 1; struct SV { int& x; int& y; int& z; }; int main() { int b = 2; int* pc = new int(3); SV sv = {a, b, *pc}; //int& array[] = {a, b, *pc}; // &array[1] - &array[0] = ? Expected ==> 4 printf("&sv.x = %p\n", &sv.x); printf("&sv.y = %p\n", &sv.y); printf("&sv.z = %p\n", &sv.z); delete pc; return 0; }
下面為輸出結果:
在C語言和 C++ 中數組的地址都是遞增的,而在該代碼中可以看到第1個元素的地址減去第二個元素的地址不為4,所以說明C++中不支持引用數組。
三、小結
- 指針是一個變量
- 引用是一個變量的新名字
- const 引用能夠生成新的只讀變量
- 在編譯器內部使用指針常量實現“引用”
- 編譯時不能直接確定初始值的 const 標識符都是只讀變量
到此這篇關于C++關于const與引用的分析講解的文章就介紹到這了,更多相關C++const與引用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
iostream與iostream.h的區(qū)別詳細解析
以下是對C++中iostream與iostream.h的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下2013-09-09