Const用法详解

来源:互联网 发布:spark windows单机 编辑:程序博客网 时间:2024/06/16 06:06
 

Const用法详解

一、const与#define的比较

C++语言可以用const来定义常量,也可以用#define来定义常量。但是前者比后者具有更多的优点:

1、  const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行静态类型安全检查;而对后者只能进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应);

2、    有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

要注意的是,const不仅仅用于定义符号常量,凡是需要编译器帮助我们预防无意中修改数据的地方,都可以使用const,比如const数据成员、const成员函数、const返回类型、const参数等。

二、const与指针的用法

1、 指向const对象的指针

指针指向const对象,不允许用指针来改变其所指的const值。为了保证这个特性,C++语言强制要求指向const对象的指针也必须具有const特性:

Const double *cptr;

这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而并非cptr本身。也就是说,cptr本身并不是const。在定义时不需要对它进行初始化,如果需要的话,允许给cptr重新赋值,使其指向另一个const对象。但不能通过cptr修改其所指对象的值:

   *cptr = 42;    //error,*cptr might be const

把一个const对象的地址赋给一个普通的、非const对象的指针也会导致编译错误:

   Const double pi = 3.14;

   Double *ptr = π      //error: *cptr might be const

   Const double *cptr = π //ok:cptr is a pointer to const

不能使用void * 指针保存const对象的地址,而必须使用 const void * 类型的指针保存const对象的地址:

   Const int universe = 42;

   Const void *cpv = &universe;   //ok:cpv is const

   Void *pv = &universe;         //error: univer is const

允许把非const对象的地址赋给指向const对象的指针,例如:

   Double dval = 3.14;

   Cptr = &dval;       //ok:but can’t change dval through cptr

尽管dval不是const对象,但任何企图通过指针cptr修改其值的行为都会导致编译时的错误。Cptr一经定义,就不允许修改其所指对象的值。如果该指针恰好指向非const对象时,同样必须遵循这个规则。

在实际的程序中,指向const的指针常用作函数的形参。将形参定义为指为const的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。

2、 Const指针

除指向const对象的指针外,C++语言还提供了const指针——本身的值不能修改:

  Int errNum = 0;

  Int *const curErr = &errNumb;  //curErr is a constant pointer

我们可以从右向左把上述定义语句读作“curErr是指向int型对象的const指针”。与其他const量一样,const指针的值不能修改,这就意味着不能使curErr指向其他对象。任何企图给const指针赋值的行为(即使给curErr赋回同样的值)都会导致编译时的错误:

curErr = curErr;   //error:curErr is const

与任何const量一样,const指针也必须在定义时初始化。

指针本身是const的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。例如,curErr指向一个普通的非常量int型对象errNumb,则可使用curErr修改对象的值。

3、 指向Const对象的const指针

还可以如下定义指向const对象的const指针:

Const double pi = 3.14159

Const double *const pi_ptr = π

既不能修改pi_ptr所指向对象的值,也不允许修改该指针的指向。

 

 

原创粉丝点击