c++ const用法

一、 基本用法概念

char greeting[] = "Hello";

char* p = greeting;      // non-const pointer, non-const data

const char* p = greeting; (char const *p = greeting ; char 和const 的位置可以变换)// non-const pointer, const data

char* const p = greeting; // const pointer, non-const data

const char* const p = greeting; // const pointer, const data

 

如果const 在星号左边,则表示被指物是常量;如果const在星号右边,则表示指针自身是常量; 如果两边都有,则表示被指物和指针自身都是常量。

 

二、 STL中const的应用

  在STL中,声明一个迭代器为const 相当于声明指针为const一样,即一个T* const指针; 如果希望迭代器所指的内容不可以被改变,即const T*指针的效果,则应该使用const_iterator:

std::vector<int> vec;

...

const std::vector<int>::iterator iter = vec.begin(); // T* const类型的iter

*iter = 10;                 // 正确

iter++;                  // 错误

 

std::vector<int>::const_iterator CIter = vec.begin(); // const T* 类型的iter

*CIter = 10;                // 错误

CIter++;                  // 正确

 

三、 const在函数声明时的使用

  在一个函数声明式中,const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。

  class Rational {  ... };

  const Rational operator* (const Rational& lhs, const Rational& rhs);

声明返回值为const,可避免下面的操作:

  Ratioinal a, b,c;

  ...

  (a * b) = c;  // 不允许

  if ( a * b = c  ) // 不允许,避免了==写成了= 的错误

 

const成员函数

  将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。这一类成员函数之所以重要,基于两个理由。第一,它们使class接口比较容易被理解。这是因为,得知哪个函数可以改动对象内容而哪个函数不行,很是重要。第二,它们使“操作const对象”成为可能。这对于编写高效代码是个关键,因为改变c++程序效率的一个根本方法就是以传递引用的方式来传递对象,而这个的前提就是我们有const成员函数可以用来处理取得(并经修饰而成)的const对象。

  在const成员函数中不允许对non-static成员变量进行赋值。使用mutable修饰成员变量,可以在const成员函数中更改他们:

class XXXX

{

  public:

    mutable bool IsLarger;    // 可在const成员函数中进行更改

    int args;        // 不可在const成员函数中进行更改

    ....

 

    void DoSomething() const

    {

      ...

      IsLarget = true;   // 正确

      args = 3;    // 错误

      ..

    }

    ...

};

 

  常量性消除(casting away constess),将返回结果去常量化:

class TextBlock

{

public:

  char& operator[](std::size_t pos ) const {  ... ; return text[pos];}  // const  成员函数

  char& operator[](std::size_t pos )  // non-const 成员函数

   {

    return const_cast<char&>    // 将op[]返回值的const移除

      (static_cast<const TextBlock&>(*this)[pos]);   // 为*this加上const性质,并调用上面的const op[]

  }  

private:

  std::string text;

};

 

四、尽可能使用const

  1 将某些东西声明为const可帮助编译器真测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体

  2 编译器强制实施bitwise constess, 但你编写程序时应该使用“概念上的常量性”

  3 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

 

posted @ 2017-07-31 17:28  opkyo  阅读(179)  评论(0)    收藏  举报