notes of c++ primer (3) -- const的那些事

来源:互联网 发布:收据打印软件免费版 编辑:程序博客网 时间:2024/05/21 14:42

const类型限定修饰符,把一个对象转换成一个常量。因为常量在定以后就不能修改,所以必须被初始化。 pointer to constant
试图将一个非const对象的指针指向一个常量对象的动作都会引起编译错误。必须声明一个指向常量的指针来做这件事。
const double *cptr;
cptr是一个指向double类型const对象的指针,但cptr本身不是常量。我们可以重新赋值cptr,使其指向不同的对象,但不能修改cptr指向的对象。
const对象的地址只能赋给指向const对象的指针,但是指向const对象的指针可以赋予一个非const对象的地址。比如: 在实际应用中,指向const的指针常被用作函数的形参,用来保证传递给函数的实际参数在函数中不会被修改:
int strcmp(const char *str1, const char *str2);

const指针
const即指针值不能修改的指针。可以定义一个const指针指向一个const对象或者非const对象。
如下所示,pival是一个指向非const对象的const指针,不能赋予pival其它的地址值,但是可以修改其指向的值。
const引用
const引用可以用不同类型的对象初始化,也可以是不可寻址的值,比如文字常量; 同样的初始化对于非const引用是不合法的,将导致编译器错误。原因如下:
引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向改对象,但用户不能访问它。
如下代码: 其汇编代码如下: 从上可以看出,编译器为文字常量分配了内存,引用指向了该内存。
再比如: 编译器将其转换成: 如果我们给ri赋值,则这样不会改变dval,而是改变temp。对用户来说,就好像修改的动作没有生效。
const引用不会暴露这个问题,因为它们只只读的。不允许非const引用指向需要临时对象的对象或值。一般来说,这比“允许定义这样的引用,但实际上不会生效”的方案要好得多。
同样,也可使用将const引用指向非const对象。 与pointer to constant类似,此时不能通过i改变ival 的值

原创粉丝点击