一、关于const类成员函数有以下几个需要注意的地方:

1. 在普通的非const成员函数中,this的类型是一个指向类类型的const指针,而const成员函数中,this的类型是一个指向const类类型对象的const指针。由于这个原因:

(1) 返回值 函数名 (参数列表) const {…} 这种格式只能用在类的成员函数中,非成员函数只能使用这种形式:void f1(const std::string& s);
(2) 如要返回该类对象的引用(*this),则在返回值声明前加上const(指向const对象的指针或引用一定要为const型的)。

2. 基于成员函数是否是const,可以进行重载,这里又有以下要注意:

(1) const成员函数中的const标签必须在函数声明和定义中都要指出;
(2) const对象只能使用const成员函数,非const对象可以使用任一成员。

3. 构造函数不可声明为const

  1. #include<iostream>  
  2. using namespace std;  
  3. class   A   
  4. {     
  5. public:       //explicit A(int); //error: 不能将参数 1 从“int”转换为“const A”,对象不能自动将const转换非const,但能将非const转换为 const的,没有问题,所以问题的实质是不能将参数 1 从“int”转换为“const A”,因为explicit使构造函数产生的隐式转换不能发 生。   
  6.     A(int);    
  7.     //A() const;-->error:“const”“this”指针对于构造函数/析构函数是非法的    
  8.     int getNum () const;//const在函数声明和定义中都要有    
  9. private:         
  10.     int   num;   
  11. };   
  12. A::A(int a)  
  13. {  
  14.     num=a;  
  15. }  
  16. int A::getNum () const//注意这里,这么设计当然是有原因的,因为基于const是可以函数重载的,const是签名的一部分,如果这里不写const,那么编译器会提示找不到重载的成员函数  
  17. {  
  18.     return num;  
  19. }  
  20. int Test(const A a)     
  21. {  
  22.     return a.getNum();//const 对象调用内部的函数必须是const的,不管是不是真的会修改成员变量,  
  23. }  
  24. int main()  
  25. {  
  26.     cout<<Test(2);  
  27.     int i;  
  28.     cin>>i;  
  29.     return 0;  
  30. }  

二、关于const类数据成员有以下几个需要注意的地方:

1. const static int 可以使static数据成员在类定义体内初始化;
2. 可以通过将数据成员声明为mutable来实现对该类const对象的该数据成员的更改;
3. 初始化const数据成员的唯一机会实在构造函数的初始化列表中,直接在类的定义体中以及在构造函数的定义体中初始化都是不正确的。