1.const引用
1.1.非const引用,只能綁定到同類型對象;
1.2.const引用,咋可以綁定到不同但相關的類型的對象,或綁定到右值;
double a = 3.14;const int &b = a; //right
2.const與iterator
2.1. const_iterator: 唯讀容器內元素;
for(vector<string>::const_iterator iter = text.bgin(); iter != text.end(); ++iter)cout<<*iter<<endl; //right*iter=" "; //wrong
2.2. const與iterator一起使用則是說明迭代器不能修改,但內容可以;
vector<int> num(10);const vector<int>::iterator iter = num.begin();*iter=1; //right++iter; //wrong
2.3. 任何改變vector的操作都會使已有的迭代器失效,例如: push_back.
3.const與指標
3.1指向const對象的指標
const double *cptr;
*cptr = 42; //error: 不能通過cptr修改其所指對象的值,但可可以使其指向另一個const對象const double pi = 3.14;double *ptr = pi // error:ptr是普通指標const double *cptr = &pi //right: cptr是指向const對象的指標
不能使用void*指標儲存const對象的地址,而必須使用const void*類型的指標儲存const對象的地址
const int universe = 42;const void *cpv = &universe: //rightvoid *pv = &universe;//wrong
允許把非const對象的地址賦給const對象的指標
double dval = 3.14;cptr = &dval;//ok:但是任何通過cptr修改其值的行為,都會導致編譯錯誤
可以將指向const的指標理解為“自以為指向const的指標”
3.2 const指標(本身不能修改)
int Num = 0; int *const Num_constp = &Num;//Num_constp是const指標
任何給const指標賦值(即使是相同值)的行為都會導致編譯錯誤(與任何const量一樣,const指標必須在定義時初始化):
Num_constp;//error
指標所指向對象的值可以修改
*Num_constp = 0;//right;只要符合該對象的類型
3.3 指向const對象的const指標(都不許改)
const double pi = 3.14; const double *const pi_ptr = &pi
3.4 typedef和const指標
const pstring cstr;
cstr是什麼類型呢?
const string *cstr;//wrong;因為const修飾的是一個類型; srting *const cstr;//right
難以理解是因為const限定符的位置既可以放在類型前也可以放在類型後;
string const s1; const string s2;//二者類型相同
對於typedef
string s; typedef string *pstring; //三種形式都代表指向string類型的const指標 const pstring cstr1 = &s; pstring const cstr2 = &s;//容易理解 string *const cstr3 = &s;