const对象const成员函数

来源:互联网 发布:java matcher group 编辑:程序博客网 时间:2024/04/30 15:39

转自http://blog.csdn.net/candcplusplus/article/details/8918469  

const对象

         如果你想定义一个永远都不会改变的类对象,可以像下面这样定义一个const对象

const CBox standard(10.0,10.0,10.0);

standard对象的成员变量的值将永不会改变。编译器为了保证const对象不会改变,不允许调用const对象的非const成员函数。即使这个非const成员函数确实没有改变任何成员变量的值。

          const对象的原理是把对象的this指针都变成指向const对象的指针(指针指向的内容不允许改变)。而调用对象的成员函数时隐含有一个this指针参数。而指向const对象的指针是不能隐式转换成指向非const对象的指针的。普通成员函数隐含的this指针参数为指向非const对象的指针。所以调用const对象的成员函数将导致编译器尝试将指向const对象的指针转换为指向非const对象指针,这是不允许的。所以通不过编译。


       const成员函数

       1.const成员函数承诺不会改变对象的成员变量值。所以在const成员函数内不允许有改变成员变量值的操作。也不允许调用对象的非const成员函数,只能调用const成员函数。

       2.const成员函数的声明和定义都必须使用const关键字(如果定义和实现是分开的),紧跟在函数参数列表后的反括号之后。就像下面这样:

[cpp] view plaincopyprint?
  1. class CBox 
  2. public
  3.     explicit CBox(double lv = 1.0,double bv = 1.0,double hv = 1.0) 
  4.     { 
  5.         //... 
  6.     } 
  7.     double Volume() const
  8.      
  9. private
  10.     double m_Length; 
  11.     double m_Width; 
  12.     double m_Height; 
  13. }; 
  14.  
  15. double CBox::Volume() const 
  16.     return m_Length*m_Height; 
及时返回值、函数名和参数完全相同,有const修饰符和没有const修饰符的函数是不同的。(const修饰符也是函数签名的一部分?)。所以你可以定义同一个函数的const和非const版本。


建议:定义类时,最好把不会改变成类员变量的成员函数都定义为const函数

原创粉丝点击