const 引用是指向const 對象的引用
const int ival=1024;
const int &refVal=ival; //ok,both reference and object are const
int &ref2=ival; //error! non const reference to a const object
可以讀取但不能修改refVal,因此,任何對refVal的賦值都是不合法的。這個限制有其意義:不能直接對ival同值,因此不能通過使用refVal來修改ival。
同理,用ival初始化ref2也是不合法的:ref2是普通的非const引用,因此可以用來修改ref2 指向的對象的值。能過ref2對ival賦值會導致修改const對象的值。為阻止這樣的修改,需要規定將普通的引用綁定到const對象是不合法的。
const 引用可以初始化為不同類型的對象或者初始化為右值,如字面值常量:
int i=42;
// legal for const reference ONLY!
const int &r=42;
const int &r2=r+i;
double dval=3.14;
const int &r3=dval;
編譯器展開:
int temp=dval;
const int &ri=temp;
非const引用只能綁定到與該引用同類型的對象。
const引用則可以綁定到不同但相關的類型的對象或綁定到右值。
在C++中真正的臨時對象是看不見的,它們不出現在你的源代碼中。建立一個沒有命名的非堆(non-heap)對象會產生臨時對象。這種未命名的對象通常在兩種條件下產生:為了使函數成功調用而進行隱式類型轉換和函數返回對象時。理解如何和為什么建立這些臨時對象是很重要的,因為構造和釋放它們的開銷對于程序的性能來說有著不可忽視的影響。
首先考慮為使函數成功調用而建立臨時對象這種情況。當傳送給函數的對象類型與參數類型不匹配時會產生這種情況。
在字符計數的例子里,能夠成功傳遞char數組到countChar中,但是在這里試圖用char數組調用upeercasify函數,則不會成功:。考慮一下這個函數:
void uppercasify(string& str);
char subtleBookPlug[] = "Effective C++";
uppercasify(subtleBookPlug); // 錯誤!
沒有為使調用成功而建立臨時對象,為什么呢?
假設建立一個臨時對象,那么臨時對象將被傳遞到upeercasify中,其會修改這個臨時對象,把它的字符改成大寫。但是對subtleBookPlug函數調用的真正參數沒有任何影響;僅僅改變了臨時從subtleBookPlug生成的string對象。無疑這不是程序員所希望的。程序員傳遞subtleBookPlug參數到uppercasify函數中,期望修改subtleBookPlug的值。當程序員期望修改非臨時對象時,對非常量引用(references-to-non-const)進行的隱式類型轉換卻修改臨時對象。這就是為什么C++語言禁止為非常量引用(reference-to-non-const)產生臨時對象。這樣非常量引用(reference-to-non-const)參數就不會遇到這種問題。
把一個const對象的地址賦給一個普通的,非const對象的指針也會導致編譯時錯誤:
const double pi=3.14;
double *ptr=π //error:ptr is a plain pointer
const double *cptr=π //ok:cptr is a pointer to const
不能使用void*指針保存const 對象的地址,而必須用const void*類型的指針保存。
const int universe=42;
const void *cpv=&universe; //ok;
void *pv=&universe; //error:universe is const
允許把非const 對象的地址賦給指向const 對象的指針:
double dval=3.14;
cptr=&dval;
typedef string *pstring;
const pstring cstr;
//cstr is a const pointer to string
string *const cstr ; // equivalent to const pstring cstr;
Sales_item成員函數形參表后面的const后面所起的作用:
const 改變了隱含的this 形參的類型。在調用
total.same_isbn(trans)時,隱含的this形參將是一個指向total對象的const Sales_item *類型的指針。
由于this 是指向const對象的指針,const 成員函數不能修改調用該函數的對象。
const 對象,指向const對象的指針或引用只能用于調用其const成員函數,如果嘗試用它們調用非
const 成員函數,則是錯誤的。
posted on 2007-05-14 15:56
清源游民 閱讀(859)
評論(0) 編輯 收藏 引用 所屬分類:
C++