posts - 0,  comments - 0,  trackbacks - 0

C++常类型(const)——Use const whenever you need
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。
一般常量和对象常量
  1. 一般常量
  一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。如:
  int const x=2;
  或
  const int x=2;
  定义或说明一个常数组可采用如下格式:
  <类型说明符> const <数组名>[<大小>]…
  或者
  const <类型说明符> <数组名>[<大小>]…
  例如:
  int const a[5]={1, 2, 3, 4, 5};
  2. 常对象
  常对象是指对象常量,定义格式如下:
  <类名> const <对象名>
  或者
  const <类名> <对象名>
  定义常对象时,同样要进行初始化,并且该对象不能再被更新,修饰符const可以放在类名后面,也可以放在类名前面。
常指针和常引用
  1. 常指针
  使用const修饰指针时,由于const的位置不同,而含意不同。下面举两个例子,说明它们的区别。
  下面定义的一个指向字符串的常量指针:
  char * const prt1 = stringprt1;
  其中,ptr1是一个常量指针。因此,下面赋值是非法的。
  ptr1 = stringprt2;
  而下面的赋值是合法的:
  *ptr1 = "m";
  因为指针ptr1所指向的变量是可以更新的,不可更新的是常量指针ptr1所指的方向(别的字符串)。
  下面定义了一个指向字符串常量的指针:
  const char * ptr2 = stringprt1;
  其中,ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此,
  *ptr2 = "x";
  是非法的,而:
  ptr2 = stringptr2;
  是合法的。
  所以,在使用const修饰指针时,应该注意const的位置。定义一个指向字符串的指针常量和定义一个指向字符串常量的指针时,const修饰符的位置不同。
      指向字符串的指针常量——const放在*后
      指向字符串常量的指针——const放在*前。
  2. 常引用
  使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下:
  const <类型说明符> & <引用名>
  例如:
  const double & v;
  在实际应用中,常指针和常引用往往用来作函数的形参,这样的参数称为常参数。
在C++面向对象的程序设计中,指针和引用使用得较多,其中使用const修饰的常指针和常引用用得更多。使用常参数则表明该函数不会更新某个参数所指向或所引用的对象,这样,在参数传递过程中就不需要执行拷贝初始化构造函数,这将会改善程序的运行效率。
常成员函数
  使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说明格式如下:
  <类型说明符> <函数名> (<参数表>) const;
其中,const是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字。
常数据成员
      类型修饰符const不仅可以说明成员函数,也可以说明数据成员。
  由于const类型对象必须被初始化,并且不能更新,因此,在类中说明了const数据成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。
===============================================================================================
用途
1、用const修饰函数的参数
     对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率.例如将void Func(A a) 改为void Func(const A &a);
     对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”.否则既达不到提高效率的目的,又降低了函数的可理解性。
2、用const修饰函数的返回值
     如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值
     如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针
     函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达
3、const成员函数
     任何不会修改数据成员的函数都应该声明为const类型.如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性
const赋值
[思考1]: 以下的这种赋值方法正确吗?const A* c=new A();A* e = c;
这种方法不正确,因为声明指针的目的是为了对其指向的内容进行改变,而声明的指针e指向的是一个常量,所以不正确;
[思考2]: 以下的这种赋值方法正确吗?A* const c = new A();A* b = c;
这种方法正确,因为声明指针所指向的内容可变;
[思考3]: 这样定义赋值操作符重载函数可以吗?const A& operator=(const A& a);
这种做法不正确;在const A::operator=(const A& a)中,参数列表中的const的用法正确,而当这样连续赋值的时侯,问题就出现了:A a,b,c:(a=b)=c;因为a.operator=(b)的返回值是对a的const引用,不能再将c赋值给const常量。
使用const的一些建议
1 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
2 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
3 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
4 const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
5 不要轻易的将函数的返回值类型定为const;6除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;


参考自:http://www.cppblog.com/mzty/archive/2005/11/09/1001.html

posted on 2012-11-16 16:28 HiHi..! 阅读(90) 评论(0)  编辑 收藏 引用 所属分类: c++

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理