C++ const修饰符的使用

来源:互联网 发布:linux touch 编辑:程序博客网 时间:2024/06/10 14:24

const修饰的物件表示该物件是只读属性,不可修改物件的数据和结构。

1.c++中为什么会引入const

 const推出的初始目的,是为了取代预编译指令,消除它的缺点,同时继承它的优点。

 大家知道,c++有一个类型严格的编译系统,这使得c++程序的错误在编译阶段即可发现许多,从而使得出错率大为减少,因此,也成为了c++与c相比,有着突出优点的一个方面。c中很常见的预处理指令 #define variablename variablevalue 可以很方便地进行值替代,这种值替代至少在三个方面优点突出:

一.是避免了意义模糊的数字出现,使得程序语义流畅清晰,如下例:
#define user_num_max 107 这样就避免了直接使用107带来的困惑。

二.是可以很方便地进行参数的调整与修改,如上例,当人数由107变为201时,进改动此处即可。

三.是提高了程序的执行效率,由于使用了预编译器进行值替代,并不需要为这些常量分配存储空间,所以执行的效率较高。

虽然预处理语句虽然有以上的许多优点,但它有个比较致命的缺点,预处理语句仅仅只是简单值替代,缺乏类型的检测机制。这样预处理语句就不能享受c++严格类型检查的好处,从而可能成为引发一系列错误的隐患。const定义像一个普通的变量定义一样,它会由编译器对它进行类型的检测,消除了预定义语句的隐患。

C++中引入const能很好地取代预定义语句,消除它的缺点,同时继承它的优点。关于提高执行效率,C++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,同时,这也是它取代预定义语句的重要基础。这一点也是它能取代预定义语句的基础,这是因为,编译器不会去读存储的内容,如果编译器为const分配了存储空间,它就不能够成为一个编译期间的常量了。

2.const在程序中的使用情况

一.用于指针定义

记住一条规则:const用于*左侧表示指针常量(指针指向的内容为常量,不可更改,但是指针本身可以更改),coust用于*右侧表示常量指针(指针本身是常量,即指针地址为常量,不可更改,但是指针指向的内容可以更改)。

char * p="mychar"

const char *  p="mychar"; //指针常量,指向常量的指针

char * const p="mychat";//常量指针,指向变量的常量指针

const char * const p="mychar";//指向常量的常量指针


二.const 限定函数的传递值参数

void fun(const char * src, char * des)

void h(const A & a)

防止传入的参数代表的内容在函数体内被改变,但仅对指针和引用有意义。因为如果是按值传递,传给参数的仅仅是实参的副本,即使在函数体内改变了形参,实参也不会得到影响,例如:

void fun(const int var); 

上述写法限定参数在函数体中不可被改变。由值传递的特点可知,var在函数体中的改变不会影响到函数外部。所以,此限定与函数的使用者无关,仅与函数的编写者有关。最好在函数的内部进行限定,对外部调用者屏蔽,以免引起困惑。如可改写如下:

void fun(int var){  

const int & varalias = var; 

varalias ....  

.....  

三.const修饰成员函数

在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数。非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。例如getter() setter()函数,getter()函数可以为const,因为不需要更改成员数据,但是setter()函数不可以为const。

class classname {  

public:  int fun() const;   

.....  

注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中均要使用const,因为const已经成为类型信息的一部分。

四。const修饰返回值

也是用const来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。归根究底就是使得函数调用表达式不能作为左值。





0 0
原创粉丝点击