今日写向量类,不想对const的使用又有了些生疏,竟然有些 地方判断错误,于是又重新整理了一下const的要点,如下。

  1.修饰常量:const int val = 100.
  const常量和#define定义的宏常量的区别在于:const常量用数据类型,因此编译器会对其进行类型安全检查,而宏常量没有类型,当然不会进行检查,所以相比之下,const常量更为安全一些。

  2.修饰指针:
  <1> const type *var 或者 type const *var
  此种类型const限定的是指针指向的对象:"指向const对象的 指针"。
  eg:
/*****
  测试const 与指针的用法
  测试const type * var
  *****/
  #include<iostream>
  using namespace std;
  int main()
  {
  int a=0,b=1;
  const int *p=&a;
  a=2;
  p=&b;
  //*p=3;error: assignment of read-only location
  cout << "a=" << a << endl;
  cout << "*p=" << *p << endl;
  }
  /*****
  测试结果:
  通过const type * var_name或者type const * var_name
  声明的指针具有以下特点:
  1.可以修改指针指向的对象
  2.不可以通过指针修改它指向的对象
  3.指针指向的对象也可以被修改
  ****/

  <2> type * const var:
  此类是const指针:const指针所指的地址不能改变,即指针的 指不能变。
  eg:
  /*****
  测试const 与指针的用法
  测试type * const var
  *****/
  #include<iostream>
  using namespace std;
  int main()
  {
  int a=0,b=1;
  int * const p=&a;
  a=2;
  //p=&b;error:assignment of read-only location
  *p=3;
  cout << "a=" << a << endl;
  cout << "*p=" << *p << endl;
  }
  /*****
  测试结果:
  const声明的是指针,所以指针指向的对象唯一确定,不能改变
  但是对象值是可以改变的。
  *****/

  <3>const type *const var:
  指向const变量的const指针。

  3.const修饰类的数据成员:
  类声明中不能初始化const数据成员,const数据成员只能在构造函数的初始化列表中进行初始化。

  4.const修饰函数返回值:
  const修饰函数返回值,如果返回值是某个对象时,此时多用于操作符的重载。除此之外,最好不要用 修饰返回值为对象类型或者对象引用的情况。
  <1>函数返回const指针,只能将指针赋值给const修饰的同类型指针变量
  <2>函数返回值为值传递时,函数会把返回值赋值给外部的临时变量,此时用const没有任何意义。
  <3>引用返回,很少用到,要保证返回值为一个全局变量。一般只出现在类的赋值函数中,以达到实现链式表达的目的。

  5.const修饰成员函数:
  f( ) const:用来保证数据成员在函数中不会被更改,但是用关键字mutable可以突破这种限制。

  总结:
  1.任何可能的情况下都应该使用const
  2.注意const赋值操作容易出现的错误
  3.不要轻易将函数返回值定义为const,除非必要
  4.非const引用必须有精确匹配的左值,而const引用不必
  5.const在类成员函数中的灵活用法

发帖者 Lain on 星期二, 十二月 02, 2008
categories: |

2 评论

  1. 匿名 Says:
  2. 《任何可能的情况下都应该使用const》

     
  3. 匿名 Says:
  4. "const修饰成员函数"
    用到

     

发表评论

文章分类

朋友群