C++ const

一、作用

  const是类型修饰符,经常用const来限制对一个对象或变量的操作,使用类型修饰符const说明的类型称为常类型,常类型的变量或对象的值是不能被更新的。const的用法很灵活,使用const将大大改善程序的健壮性。

二、用法

1.const常量

  const int NUM=100;

  int const NUM=100;

  以上两者一样,NUM不能被修改,且在声明时必须初始化。若为外部的,则可以不初始化。

2.const指针

  (1)指针常量:指针本身是常量不可变,但指针指向的内容可变。
  char*  const  pContent;
  (2)常量指针:指针所指向的内容不可通过这个指针改变,可以通过原来的声明修改,指针本身可变。
  const  char* pContent; 

  char const *pContent; 

  两者一样。

  (3)指向常量的指针变量:两者都不可变。
  const char* const pContent; 
  (4)区别方法:
  如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
  如果const位于*的右侧,就表明声明的指针是一个常量。

3.const函数参数

      出现在函数参数中的const表示在函数体中不能对这个参数做修改。const通常用来限制函数的指针参数、引用和数组参数,而一般形式的参数因为形式参数和实参本来就不在同一个内存空间,所以对形式参数的修改不影响实在参数,因此也没有必要限制函数不能对参数进行修改。

例如:

  (1)void function(const int Var);

  void function(char* const Var);

  以上两者const无意义,本身就是形参。

  (2)函数strcpy()将src字符串的内容复制到targ字符串中,为保证src字符串不被修改,将它定义问const参数:

  void strcpy(const char* src,char * targ);

  (3)函数max() 从数组array中找出具有最大值的数组元素并返回这个最大元素的值,为保证数组元素不会再函数中被修改,将它定义为const参数:int max(const int array[] ,int size);

      (4)函数outputOjbect()将类MyClass的对象obj的内容输出。对象定义为const引用,即可以保证对象不会在函数体中所改变,又可以节省对象传递的开销(若按值传递会产生对象的副本):void outputObject(const MyClass & obj);

4.const函数返回值

  const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。因为返回实例只能访问类中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。

5.const类成员变量

  只能在初始化列表中赋值。

  class A
  { 
          …
          const int nValue;         //成员常量不能被修改
          …
          A(int x): nValue(x) { } ; //只能在初始化列表中赋值
  } 

6.const类成员函数

  const修饰类的成员函数,则该成员函数不能调用类中非const成员函数。一般写在函数的最后来修饰。
  class A
  { 
          …
         void function() const; //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。

  }

  a. const成员函数不被允许修改它所在对象的任何一个数据成员。

  b. const成员函数能够访问对象的const成员,而其他成员函数不可以。

  c.const修饰类对象/对象指针/对象引用

   const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。

   const修饰的对象/指针/引用,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。
  例如:

  class AAA
  { 
      void func1(); 
      void func2() const; 
  } 
  const AAA aObj; 
  aObj.func1(); ×
  aObj.func2(); 正确

  const AAA* aObj = new AAA(); 
  aObj-> func1(); ×
  aObj-> func2(); 正确

三、使用const的建议

  要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;

  不要轻易的将函数的返回值类型定为const,除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

  任何不会修改数据成员的函数都应该声明为const 类型。

posted on 2017-08-22 15:29  chakyu  阅读(130)  评论(1编辑  收藏  举报

导航