1,關於 const 的疑問:
1,const 什麼時候為唯讀變數,什麼時候是常量;
1,const 從 c 到 c++ 進化的過程中得到了公升級,const 在 c++ 中不僅僅像在 c 中宣告乙個唯讀變數,其在 c++ 中完全可以得到乙個常量;
2,const 常量的判別準則:
1,只有用字面量初始化的 const 常量才會進入符號表;
1,這裡是字面量初始化 const 常量,不是 const 常引用;
2,得到了真正意義上的常量;
2,使用其他變數初始化的 const 常量仍然是唯讀變數;
1,編譯器在編譯期間不可能知道變數初始化時候的值;
2,得到唯讀變數;
3,被 volatile 修飾的 const 常量不會進入符號表;
1,volatile 表示宣告的識別符號是易變的;
2,這個可能的易變性也許不在當前編譯的檔案中,發生在外部;
3,外部相當於在其它檔案中,比如多執行緒、中斷等;
4,每次訪問 volatile 修飾的識別符號時,因為是易變的,所以應該到記憶體中直接讀取;
5,意味著被 volatile 修飾的識別符號不可能進入符號表;
6,意味著當 volatile 和 const 同時修飾乙個識別符號時,得到的是唯讀變數,不可能進入符號表;
7,const 此時的意義說明在當前的檔案或者當前的作用域當中,volatile 和 const 一起修飾的識別符號不能出現在賦值符號的左邊;
(4),在編譯期間不能直接確定初始值的 const 識別符號,都被作為唯讀變數處理;
3,const 引用的型別與初始化變數的型別:
1,相同:初始化變數成為唯讀變數;
2,不同:生成乙個新的唯讀變數;
4,const 典型問題分析程式設計實驗:
1,main.cpp 檔案:
1 #include 23int
main()
4
2,輸出結果:
1 x = 1//進入符號表,編譯期間就是 1;
2 rx = 5
3 nrx = 5
4 &x = 0xbfb1a708
//為const修飾的識別符號分配空間,通過指標或引用使用;
5 &rx = 0xbfb1a708
6 &nrx = 0xbfb1a708
7 y = 6
8 p = 0xbfb1a6fc
9 z = 7
10 p = 0xbfb1a6f4
11 c =a
12 rc =a
13 trc = c //
原始的賦值結果;
14 &c = 0xbfd1242f
15 &rc = 0xbfd1242f
16 &trc = 0xbfd12408
//新開闢的空間;
5,關於引用的疑問:
1,引用與指標有什麼關係,如何理解「引用的本質就是指標常量」;
6,指標和引用分析:
1,指標是乙個變數:
1,值為乙個記憶體位址,不需要初始化,可以儲存不同的位址;
2,通過指標可以訪問對應記憶體位址中的值;
3,指標可以被 const 修飾成為常量或者唯讀變數;
2,引用只是乙個變數的新名字:
1,對引用的操作(賦值,取位址等)都會傳遞到代表的變數上;
1,新名字是一段記憶體空間的代號;
2,引用是給已經存在的合法記憶體空間乙個新的代號;
2,const 引用使其代表的變數具有唯讀屬性;
3,引用必須在定義時初始化,之後無法代表其它變數;
1,身份證號代表乙個人,不能復用;
2,乙個車牌號就代表乙個車,不能復用;
3,因為是指標常量,所以不能代表其它變數;
7,從 c++ 不同角度分析引用:
1,從使用 c++ 語言的角度來看:
1,引用與指標沒有任何的關係;
2,引用是變數的新名字,操作引用就是操作對應的變數;
2,從 c++ 編譯器的角度來看:
1,為了支援新概念,「引用」必須要乙個有效的解決方案;
2,在編譯器內部,使用指標常量來實現「引用」;
3,因此「引用」在定義時必須初始化;
8,在工程專案開發中:
1,當進行 c++ 程式設計時,直接站在使用的角度看待引用,與指標毫無關係,引用就是變數的別名;
2,當對 c++ **進行除錯分析時,一些特殊情況,可以考慮站在 c++ 編譯器角度看待引用;
3,下面**正確嗎?
1int a = 1;2
int b = 2;3
int* pc = new
int(3);4
int& array = [a, b, *pc];
9,引用典型問題分析程式設計實驗:
1,main.cpp 檔案:
1 #include 23int a = 1;4
5structsv6
;1112int
main()
13; //
結構體中的每個元素是引用就可以;
17//
int& array = ;
//陣列中的每個元素是引用就不可以;error: declaration of 『array』 as array of references; c++ 天生要支援 c 語言,c 語言中陣列中的每個元素在記憶體中是順序存放的,位址是遞增的,所以在 c++ 中也要相容這個特性,而在 c++ 中唯有引用陣列破快了這個特性,所以說 c++ 中不支援引用陣列;&array[1] - &array[0] = ? expected ==> 4;
1819 printf("
&sv.x = %p\n
", &sv.x);
20 printf("
&sv.y = %p\n
", &sv.y);
21 printf("
&sv.z = %p\n
", &sv.z);
2223
delete
pc;24
25return0;
26 }
2,輸出結果:
&sv.x = 0x804a020
&sv.y = 0xbffe92bc
&sv.z = 0x9f97008
3,在開發中遇到奇怪的 bug,要站在編譯器的角度考慮問題;
10,小結:
1,指標是乙個變數;
2,引用是乙個變數的新名字;
3,const 引用能夠生成新的唯讀變數;
4,在編譯器內部使用指標常量實現「引用」;
1,c++ 中為了相容 c 語言中的所有特性,放棄了引用陣列,這樣會使得相鄰元素的位址之差不是期望的;
5,編譯時不能直接確定初始值的 const 識別符號都是唯讀變數;
指標和引用,const 指標和const 引用
指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...
C 中引用 指標 const
引用變數名不存在實體,即在記憶體中存沒有為此變數開闢記憶體空間。如int a0,程式會在記憶體中建立2或4位元組的空間儲存a0變數,但int a1 a0,並不會在記憶體中開闢乙個2或4位元組的空間來儲存a1,而是將a1和a0關聯起來,通過操作a1可操作a0 功能類似指標 既然如此,為何非得多此一舉?...
C 中const引用和非const引用的使用注意
今天學習時突然有疑惑,c 有了指標為何還要設計引用呢?後來看到一篇部落格豁然開朗 為什麼 c 有指標了還要引用?總結一下 更加簡潔好看了 由於引用必須被初始化,並且之後也無法重新繫結其他物件,這樣就更安全了 為了操作符過載,比如部落格中那個過載 的例子 並且,在了解了這些之後,對引用的一些其他特性也...