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
清源游民 阅读(830)
评论(0) 编辑 收藏 引用 所属分类:
C++