寒星轩

There are innumerable stars in the sky, the smallest is me!

用户操作
[即时聊天] [发私信] [加为好友]
李星ID:starlee
207593次访问,排名341好友65人,关注者107
欢迎大家访问我的Blog。
主要是C++,设计模式,面向对象设计方面的技术文章。
starlee的文章
原创 98 篇
翻译 0 篇
转载 45 篇
评论 331 篇
李星的公告
郑重声明

        本BLOG所发表的 原创文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者(StarLee)和出处(CSDN Blog)。
作者Email:
coolstarlee(at)sohu.com
最近评论
陈诚:好象不一样,我这个共两个类,实现类和接口类
深夜才走在路上:实际上使用CLR封送C++类让人很受伤,在mc中有很多C++的特性不能使用,甚至STL都不可用
hfg :错了错了,当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

不管基类的析构函数是不是virtual ,派生类的析构函数还是会被调用的,区别只是在于基类的析构函数有没有被调用
Forrest Yu:Star Lee:

如果有两个以上的类需要包装,那又应该怎样做呢?
Forrest Yu:CLR 还是很强大的,
一些老的MFC项目可以先手动添加
#include <afx.h>,
其他的可能要加
#include <windows.h>,
然后再用这种方法.
文章分类
收藏
相册
友情链接
houdy的专栏
lijgame的专栏
lyrebing的专栏
禾青谷
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 C++中的mutable关键字收藏

新一篇: 海南风光 | 旧一篇: C++中重载决议与可访问性检查的顺序

    mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
    在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
    我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。
    下面是一个小例子:

class ClxTest
{
public:
    
void Output() const;
};

void ClxTest::Output() const
{
    cout 
<< "Output for test!" << endl;
}

void OutputTest(const ClxTest& lx)
{
    lx.Output();
}

    类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。
    函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。
    如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。
    下面是修改过的代码:

class ClxTest
{
public:
    ClxTest();
    
~ClxTest();

    
void Output() const;
    
int GetOutputTimes() const;

private:
    mutable 
int m_iTimes;
};

ClxTest::ClxTest()
{
    m_iTimes 
= 0;
}

ClxTest::
~ClxTest()
{
}

void ClxTest::Output() const
{
    cout 
<< "Output for test!" << endl;
    m_iTimes
++;
}

int ClxTest::GetOutputTimes() const
{
    
return m_iTimes;
}

void OutputTest(const ClxTest& lx)
{
    cout 
<< lx.GetOutputTimes() << endl;

    lx.Output();

    cout 
<< lx.GetOutputTimes() << endl;
}

    计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。

发表于 @ 2006年12月05日 09:13:00|评论(loading...)|编辑

新一篇: 海南风光 | 旧一篇: C++中重载决议与可访问性检查的顺序

评论

#dayn9 发表于2007-03-09 15:37:19  IP: 222.71.87.*
mutable的更主要应用场合应该是防止编译器对被多个线程写的变量进行过度激进的优化.
#windleaf_2006 发表于2007-08-31 17:19:39  IP: 58.211.28.*
mutable?楼上说的是volatile吧?
#furniture 发表于2007-10-30 14:05:21  IP: 219.134.114.*
very good!
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 李星