&是為了引用傳遞,防止值傳遞的複製資料,
const
是為了保護資料不被改動。
const&防止傳值時拷貝建構函式的呼叫開銷
2、形參的物件為頂層
const
時,傳入的實參既可以是
const
值,又可以是非
const
值,若是底層
const
,傳入的實參只能是
const
的值。頂層 const表示的是指標本身是乙個常量, 底層
const
表示的是指標所指的物件是乙個常量。
const int a;//頂層
const
const int *a;//底層
const
int * const a;//頂層
const
const int &a;//底層
const
更一般情況下,
頂層const可以表示任意物件是乙個常量,這對於算術型別、類、指標等任何資料型別都是成立的,
底層 const則與指標和引用等復合型別的基本型別部分有關,
比較特殊的是,指標既可以是頂層 const也可以是底層
const
,這一點與其他型別區別明顯。
2. 頂層
const
與底層
const
在執行拷貝操作時的不同
對於頂層 const與底層
const
,在執行物件拷貝時有著明顯的不同:
(1)頂層
const
不受什麼影響
int i = 0;
const int ci = 42; // 不能改變
ci 的值,這是乙個頂層
const
i = ci; // 正確:
ci 是乙個頂層
const
,對此操作無影響
const int *p2 = &ci; // 允許改變
p2 的值,這是乙個底層
const
const int *const p3 = p2; // 靠右的
const
是頂層const
,靠左的是底層
const
p2 = p3; // 正確:
p2 和
p3 指向的物件的型別相同,
p3頂層
const
的部分不影響
(2)底層
cons
的限制不能忽略
要求拷出和拷入的物件有相同的底層 const資格或者能轉換為相同的資料型別,一般非常量能夠向常量轉換,反之則不行
int *p = p3; // 錯誤:
p3 包括底層
const
定義,而
p 沒有
p2 = p3; // 正確:
p2 和
p3 都是底層
const
p2 = &i; // 正確:
int*
能轉換成
const int*
int &r = ci; // 錯誤:普通的
int&
不能繫結到
int
常量上
const int &r2 = i; // 正確:
const int&
可以繫結到乙個普通
int
上
c 複製建構函式形參為什麼是const引用
使用反證法即可證明。如果使用值傳遞形式構造類的複製建構函式,在使用a初始化t時,呼叫複製建構函式。該函式為值傳遞形參,需要對a進行複製操作,又會呼叫複製建構函式,而複製建構函式是值傳遞,又需要進行複製操作 無限迴圈下去。顯然值傳遞是不可行的,解決辦法就是採用引用傳遞。class base base ...
函式形參 指標,引用,const,陣列形參
指標也是物件,也會拷貝,所以分實參指標和形參指標。在傳進函式時,實參進行拷貝,所以在函式裡改變指標值不影響實參。void reset int ip 引用不是物件,通過引用可以改變實參 void reset int i 使用引用的好處是避免了拷貝。其實也只是兩個變數名的傳遞,和變數規則一致,如果在函式...
函式形參中的const引用
這裡將c primer中函式形參章節有關const和引用的問題簡單小結如下 一 非const非引用形參 這個是乙個平庸的情形。函式引數通過複製對應的實參實現初始化,函式本身對形參的修改不會影響到實參。傳遞給這類函式的實參可以是乙個const型的物件,也可以是非const的物件。乙個需要注意的事情是,...