浅析const在C++中的使用

时间:2022-10-12 09:23:31

摘要:const允许程序员指定一个语义约束,他允许你告诉编译器和其他程序员某值应该保持不变,而编译器会强制实施这项约束。const的用法是十分丰富的,可以用来定义一个常量,修饰指针、函数。而对const的使用可以大大的加强程序的可读性和健壮性。

关键词:const C++ 常量

中图分类号:TP31

文献标识码:A

文章编号:1007-3973(2011)010-071-02

在C语言中我们常常使用#def'me来定义一个常量,例如:#define PI 3.14

这样的好处是:提高程序的可读性,当我们看到常量PI时可以立即明白它所代表的含义,而不是单纯的一个数字;提高程序的可维护性,如我们需要改变PI的精度,如需要把3.14改为3.1415,可直接修改定义,而不用逐一修改,减少修改所造成的错误。

这种#define语句虽然方便但存在一些问题。因为#define是宏定义命令而不是c语句,它并不被视为语言的一部分。因此对于编译器来说也许从未被看见,也许在开始处理源码之前就被预处理器移走了。于是常量名称PI可能没进入记号表内。于是当你运用此常量但获得一个编译错误信息时可能会带来困惑,因为这个错误信息也许会提到3.14而不是PI。

C++在C语言的基础上进行了大量扩充,其中一个很重要的内容就是修改了const的使用。const具有很多功能,它可以用来修饰常量、指针、引用、函数的输入参数、函数的返回值甚至函数本身。它可以大大的提高程序的健壮性。因此在很多c++书籍中都存在诸如:“尽量以const替换#define”、“尽可能使用const”这样的描述。下面来看const的使用。

l、const常量

eonst常量比用#define有几点好处:const常量会进入记号库,而不会像用#define一样只是将常量名称盲目的替换为它所代表的数字并产生更多的代码;const常量有数据类型,而宏常量没有,编译器可以对前者进行类型安全检查:一些集成化的调试工具可以对eonst常量进行调试,但是不能对宏常量进行调试。文章开头的语句我们可以写做:

constdoublePI=3.14;这里值得注意的是,因为常量在定义后就不能被修改,所以定义时必须初始化。既然const属于c++语言那么它只在作用域中是有效的,我们一般将const常量的定义放在头文件中定义,它的作用域就是该文件。但是我们常常想要把这个常量定义为全局变量,希望在整个程序中都能使用它,这就需要使用extem声明,这样就可以使const常量可以在整个程序中使用。如下例所示:

//filel-h

extem const double PI=3.14;

Hfile2 h

#include“filel.h”

extem const double PI;

2.const修饰指针

const修饰指针有两种选择:const修饰指针指向的对象,const修饰指针本身。我们看如下一个例子:

intb:500;constint*a=&b;[a]int const *a=&b:[b]

int*const a=&b;[c]const int*const a=&b;[d]

看到如上一段代码很多人都会迷惑于例中四个语句的区别。我们可以采用如下方法区分:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此[a]和[b]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操作,如不能*a=3;[c]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[d]为指针本身和指向的内容均为常量。

3、const修饰函数的参数

如果参数做输出用,不论它是什么数据类型,也不论它采用指针传递还是引用传递,都不能加const修饰,否则该参数将失去输出功能,const只能修饰输入函数。const的作用是使函数不能修改被const修饰的参数,它的使用可以避免函数编写过程中对一些不应该被修改的参数进行了修改而导致的错误。如库函数strcpy的原型为=char*swepy(char*strDest,constchar*strSrc);这里使用了const来修饰源字符串,避免在程序中错误的操作造成对源字符串的修改而导致整个程序输出错误。

4、const修饰函数的返回值

如果函数返回值采用值传递方式,函数会把返回值复制到外部临时的存储单元中,加const修饰就没有任何价值。因此const主要用于修饰采用指针传递方式的函数返回值。如果给以指针传递方式的函数返回值加const修饰,那么返回值的内容就不能被修改,这个返回值也只能被赋给加const修饰的同类型指针,否则就会出现编译错误。如下例所示:

const char*GetString();char*str=GetString();//错误con-st char*str=GetString();//正确

5.const成员函数

如果声明一个成员函数为const函数,则(下转第148页)等于告诉编译器可以为一个const对象调用这个函数。一个没有被特别声明为const的成员函数被看成是将要修改对象中数据成员的函数,而且编译器不允许为一个const对象调用这个函数。这样做主要有两个优点:它们使类接口比较容易被理解,我们可以很轻松的得知哪个函数可以改动对象内容而哪个函数不行;它们使“操作const对象”成为可能。

任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误,这无疑会避免一些错误的发生。关于这一点我们可以看如下示例:

class Book

{

private:

s~ing BookName;

public:

void ShowBookName(Book book)consg

):

int main()

{

Bookbook:

ShowBookName(book);

return O;

)

这段程序里我们定义的ShowBookName()函数用来在显示书本的书名,这个函数显然是不需要修改任何数据成员的。

以上我们从几个方面总结了const的一些常用方法,当然C++是一门博大精深的编程语言,const的作用和功能也是十分强大的,短短一篇文章并不能完整向大家展示,而它的使用更是需要在日积月累的编程实践中不断地学习摸索。

参考文献:

[1]ScottMeyers.EffectiveC++中文版(第三版)[M].电子工业出

版社,2006.

[2]Brace Eckel.Thinging in C++(中文版)[M].机械工业出版社,

2000.

[3]林锐.高质量C++/C编程指南[M].电子工业出版社,2000.

[4]Stanley B.Lippman,Josee Lajoie,Barbara E.Moo.C++Primer

中文版(第四版)[M].人民邮电出版社,2006.

上一篇:Internet云计算技术 下一篇:点对点短信时延分析及优化