C++筆記 第十二課 經典問題解析一---狄泰學院
阿新 • • 發佈:2018-11-06
#1024程式設計師節#
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第十二課 經典問題解析一
1.關於const的疑問
const什麼時候是隻讀變數?什麼時候是常量?
const常量的判斷準則
只有用字面量初始化的const常量才會進入符號表—真正意義上的常量
使用其他變數初始化的const常量仍然是隻讀變數—只讀變數
被volatile修飾的const常量不會進入符號表(外部:多執行緒、中斷)—只讀變數
在編譯期間不能直接確認初始值的const識別符號,都被作為只讀變數處理。
const引用的型別與初始化變數的型別
相同:初始化變數稱為只讀變數
不同:生成一個新的只讀變數
12-1 const典型問題分析
#include <stdio.h> int main() { const int x = 1;//constant Symbol table const int& rx = x;//rx represent read only variable 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指向z的空間 *p = 7; //通過p改變z空間的值 printf("z = %d\n", z); printf("p = %p\n", p); //用不同型別變數來初始化const識別符號C char c = 'c'; //字元 char& rc = c; //char型別的引用 const int& trc = c; //定義const引用 rc = 'a'; printf("c = %c\n", c); printf("rc = %c\n", rc); printf("trc = %c\n", trc);//引用型別為int,初始化變數型別為char,兩者不同,則生成一個新的只讀變數trc,rc = 'a';語句改變了變數c和rc的值,無法改變trc變數的值,則輸出原始結果 return 0; } 執行結果 x = 1 rx = 5 nrx = 5 &x = 0x7ffe49326340 &rx = 0x7ffe49326340 &nrx = 0x7ffe49326340 y = 6 p = 0x7ffe49326344 z = 7 p = 0x7ffe49326348 c = a rc = a trc = c
2.關於引用的疑問
引用與指標有什麼關係?如何理解“引用的本質就是指標常量”?
指標是一個變數
值為一個記憶體地址,不需要初始化,可以保持不同的地址
通過指標可以訪問對應記憶體地址中的值
指標可以被const修飾成常量或者只讀變數
引用只是一個變數的新名字
對引用的操作(賦值,取地址等)都會傳遞到代表的變數上
const引用使其代表的變數具有隻讀屬性
引用必須在定義時初始化,之後無法代表其它變數(不能複用)
從使用C++語言的角度來看
引用與指標沒有任何的關係
引用是變數的新名字,操作引用就是操作對應的變數
從C++編譯器的角度來看
為了支援新概念“引用”必須要一個有效的解決方案
在編譯器內部,使用指標常量來實現“引用”
因此“引用”在定義時必須初始化
在工程專案開發中
當進行C++程式設計時,直接站在使用的角度看待引用,與指標毫無關係,引用就是變數的別名
當對C++程式碼進行除錯分析時,一些特殊情況,可以考慮站在C++編譯器的角度看待引用
下面的程式碼有問題嗎?
12-2 引用典型問題分析—程式設計角度看
#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
//C++中不支援引用陣列
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;
}
執行結果
&sv.x = 0x601050
&sv.y = 0x7ffea5d06f74
&sv.z = 0x1cbdc20
小結
指標是一個變數
引用是一個變數的新名字
const引用能夠生成新的只讀變數
在編譯器內部使用指標常量實現“引用”
編譯時不能直接確定初始值的const識別符號都是隻讀變數