C++中const限定符的一些用法

来源:互联网 发布:yum lmysqlclient 编辑:程序博客网 时间:2024/06/02 20:42
以下是一些零碎的用法总结,其中若有错误之处,希望大家提出批评,我定会认真修正。

1:在默认的情况下,在全局作用域声明的const变量是定义该对象的文件的局部变量。在其他文件中是不能访问的。要想让在当前位置定义的const变量能够被其他文件所访问,则必须在该文件定义是声明他是一个外部变量,方法是在前面加上extern(而非const变量则默认为extern),在其他文件中使用的话,亦需加extern。


2:const全局变量的作用域为当前文件的好处:
当const变量为一个常量表达式初始化时,为了让他在全部源文件中使用,可以将它写入头文件之中。在头文件中我们知道是不能定义一个非const变量或是一个用非常量表达式初始化的一个const变量,原因是这样的话避免不了重定义。比如说你在头文件bianliang.h中定义了int i = 0;此时i为全局变量,当在文件bianliang.cpp中使用#include"bianliang.h"时,相当于在当前文件中bianliang.cpp中又定义了一次i变量(注意bianliang.h,bianliang.cpp是两个不同的文件)。
这就好了,我们知道,const变量的作用域为局部,即当前文件之中,这样就避免了以上的冲突,但是注意,仅限于const常量表达式。
据《C++ Primer》上的说明:大多数编译器在编译时都会用相应的常量表达式来替换这些const变量的使用,所以在实践中不会有任何存储空间用于存储用常量表达式初始化的const变量。
3:const引用:
需要注意的是非const引用只能绑定到与该引用同类型的对象,而const引用则可以绑定到不同或相关类型的对象或是绑定到右值。
这个《C++ Primer》第四版page52页有详细的解释:这里我照搬了,仅供参考。。。。。
eg:int i = 42; const int &r=42; const int &r = r+i;
这样是合法的,而如果改成int &r=42;int &r=r+i就不对了。对于int i = 42; const int &r=42;编译器会将代码转化为如下形式:
int temp = 42; const int r = temp;所以从本质上来看,const和非const引用都是引用同类型的对象。这样的好处是使被引用的对象不能被修改。
有些参考书上的说明:应尽可能的使用const引用,有一下三个理由:
一、使用const可以避免无意中修改数据的编程错误。
二、使用const可以使函数能够处理const和非const实参,否则只能接受非const数据。
三、使用const引用函数能够正确的生成并使用临时变量。(由于非const引用只能绑定到与其同类型的变量)

4:const指针和指向const的指针
不管对象是否为const类型,都可以用指向const的指针标记。而指向const的指针不管指向哪里,都默认自己指向的对象时const类型的,因此不能用该指针去更改他所指向的对象。还有要注意必须使用const void*类型的指针保存const对象的地址,其定义的形式如:const int *i;
const指针则是本身为const,不能被更改。但其指向的对象如果是非cosnt类型的话就可以被修改。定义的形式:int j = 0; int *const i = &j; 


5:利用const引用避免复制实参:
当在向函数传递大型对象时,用引用则可以避免大量的复制工作,而使用const引用则更加的安全,可以保护被引用的对象。
6:用const引入常量成员函数:给大家一个网址,上面对此解释的比较清楚:http://blog.163.com/wgsjack199213@yeah/blog/static/1079032872011913429671/
原创粉丝点击