const成员函数和mutable

 

const成员函数和mutable

标签: iostreamconstructorclasslistc
  1154人阅读  评论(0)  收藏  举报

const成员函数不能修改调用它的对象。类的成员函数可以被声明为const,这将使得函数的隐式参数this将被作为const类型的指针。这也就意味着一个const成员函数不能修改调用它的对象。而且,const对象不能调用非const成员函数。然而,const对象和非const对象都可以调用const成员函数。

要将一个成员函数声明为const,可以使用下面的形式:

[cpp]  view plain  copy
  1. class X  
  2. {  
  3.       int some_var;  
  4. public:  
  5.       int f1() const;//const成员函数  
  6. };  
 

可以看到,关键字const被放在函数声明之后。将一个成员函数声明为const的目的是防止函数修改调用它的对象。例如下面的代码:

[cpp]  view plain  copy
  1. #include <iostream>    
  2. using namespace std;  
  3. //说明const函数的用法,这个程序不能通过编译  
  4. class Demo  
  5. {  
  6.     int i;  
  7. public:  
  8.     int get() const  
  9.     {  
  10.         return i;//正确  
  11.     }  
  12.     void seti(int x) const  
  13.     {  
  14.         i=x;//错误!  
  15.     };  
  16. };  
  17. void main()      
  18. {        
  19.     Demo ob;  
  20.     ob.seti(1900);  
  21.     cout<<ob.get()<<endl;  
  22. }     
  23. //运行结果  
 

上面的这个程序不能通过编译,因为函数seti()被声明为const成员函数,这意味着在函数中不能修改调用函数的对象。但是由于seti()试图修改成员变量i,所以程序会产生错误,而在函数geti()中并不修改成员变量i,所以这个函数是正确的。

有时你可能想在const函数中修改类的某些成员,但又不想让函数修改类的其它成员,那么可以通过关键字mutable来实现这种功能。mutable将覆盖const属性。也就是说,在const成员函数中可以修改mutable成员,例如:

[c-sharp]  view plain  copy
  1. #include <iostream>    
  2. using namespace std;  
  3. //可以通过编译,运行正确  
  4. class Demo  
  5. {  
  6.     mutable int i;  
  7. public:  
  8.     int get() const  
  9.     {  
  10.         return i;//正确  
  11.     }  
  12.     void seti(int x) const  
  13.     {  
  14.         i=x;//错误!  
  15.     };  
  16. };  
  17. void main()      
  18. {        
  19.     Demo ob;  
  20.     ob.seti(1900);  
  21.     cout<<ob.get()<<endl;  
  22. }     
  23. //运行结果  
  24. 1900  
 

在上面的程序中,类的成员变量i被定义为mutable,所以在函数seti()中可以修改它的值。

const成员变量的初始化

在构造函数中对成员变量进行初始化是很普遍的初始化方法,然而,这种方法并不是适用于所有情况,例如:如果在类的定义中使用了const来声明成员变量,那么在类的构造函数中将不能对这些成员变量赋初始值,因为const变量必须在构造函数调用之前被初始化在使用“引用类型的成员”以及“没有默认构造函数的成员”时存在着同样的问题,因为这些成员必须首先被初始化为了解决这个问题,在C++中定义了一种成员初始化语法,可以在创建对象时为类的成员指定初始值。

成员初始化语法 类似于 调用基类构造函数的语法,它的通用形式如下所示:

constructor(arg_list):member(initlalizer),member(initlalizer),member(initlalizer)

{//构造函数体}

在构造函数的后面指定你想要初始化的成员,同时用冒号将构造函数的名字和参数列表分开。也可以将基类构造函数的调用和成员的初始化放在同一参数列表中。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值