mutable的用法

Hillycm 2008-10-02 12:23:13
找工作时遇到这么一个名词解释,mutable,谁用过这个东西
...全文
611 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgjxwl 2008-10-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lyle3 的回复:]
加了又能改变了,跟不是const函数又有啥区别呢?。。。。 俺一直想不明白
[/Quote]
有区别的呀,mutable是用以指定一个或多个特定的数据成员可以在一个const对象里改变
对于const成员函数:本身是不允许通过这个成员函数修改类的数据成员的,但是如果在类的某个(当然也可以是多个)数据成员前冠以mutable修饰,就表示该数据成员可以在const成员函数中被修改(可以说,mutable就是为了破除const成员函数的这种限定而产生的),但是其他未被mutable修饰的数据成员依然不能在const成员函数中修改

对于非const普通成员函数:类的数据成员本身在它之内就是可以被修改的,所以加不加它无所谓,其实,mutable产生的目的是为了const成员函数的

举个例子:

//分别加上和去掉注释来编译这个程序
// Mutable.cpp
// The "mutable" keyword

class Z {
int i;
mutable int j;
public:
Z();
void f() const;
void g();
};

Z::Z() : i(0), j(0) {}

void Z::f() const {
//! i++; // Error -- const member function
j++; // OK: mutable
}
void Z::g(){
i++;
j++;
}

int main() {
const Z zz;
Z tt;
zz.f(); // Actually changes it!
tt.g();
} //
帅得不敢出门 2008-10-03
  • 打赏
  • 举报
回复
mutable member-variable-declaration;

This keyword can only be applied to non-static and non-const data members of a class. If a data member is declared mutable, then it is legal to assign a value to this data member from a const member function.

一个类的成员函数如果声明为const,比如
int CXXX::GetValue() const //就是后面这个const
那么在这个函数里面是不可以改变成员变量的值的,并且这个函数里面也只能调用声明为const的其他成员函数。如果在这种情况下你想改变某一个成员变量的值,那么就要把这个成员变量声明为mutable
另外,如果一个对象是const对象,那么,通过这个对象,你将只能调用那些声明为const的成员函数

#include <iostream>
#include <iomanip>

using namespace std;

class C
{

public:
C(int i):m_Count(i){}
int incr() const//注意这里的const
{
return ++m_Count;
}
int decr() const
{
return --m_Count;
}
private:
mutable int m_Count;//你可以试着将这里的mutable去掉再编译试试
};

void main()
{
C c1(0),c2(10);
for(int tmp,i=0;i<10;i++)
{
tmp = c1.incr();
cout<<setw(tmp)<<setfill(' ')<<tmp<<endl;
tmp = c2.decr();
cout<<setw(tmp)<<setfill(' ')<<tmp<<endl;
}
}
csucdl 2008-10-03
  • 打赏
  • 举报
回复
不要不编译器过不去, 不知道也无所谓。
zgjxwl 2008-10-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lyle3 的回复:]
我是觉得,既然指定了const,那又何必去修改呢?如果要修改,又何必指定const呢?
不知道自然世界里有没有这样的例子。
[/Quote]
指定了const就限制了使所有的类数据成员不能改变,通过mutable
可指定某个特定的成员可以被改变,可能实际中并不希望所有的成员都不被改变把
有的时候或许需要改变其中的某一个,它就用在这里把,呵呵..
lyle3 2008-10-03
  • 打赏
  • 举报
回复
我是觉得,既然指定了const,那又何必去修改呢?如果要修改,又何必指定const呢?
不知道自然世界里有没有这样的例子。
puzzlesky 2008-10-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Mac_cm 的回复:]
引用 1 楼 baihacker 的回复:
在一个类中,有一系列成员数据.
一个类的接口可能是一个常函数(函数后面加const)
在这种情况下,成员数据就不可改变了.
如果成员数据前加mutable,在常函数里面可以改变的.

up
[/Quote]

up
Walker-cheng 2008-10-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
在一个类中,有一系列成员数据.
一个类的接口可能是一个常函数(函数后面加const)
在这种情况下,成员数据就不可改变了.
如果成员数据前加mutable,在常函数里面可以改变的.
[/Quote]
up
baihacker 2008-10-02
  • 打赏
  • 举报
回复
在一个类中,有一系列成员数据.
一个类的接口可能是一个常函数(函数后面加const)
在这种情况下,成员数据就不可改变了.
如果成员数据前加mutable,在常函数里面可以改变的.
lyle3 2008-10-02
  • 打赏
  • 举报
回复
加了又能改变了,跟不是const函数又有啥区别呢?。。。。 俺一直想不明白
kkndciapp 2008-10-02
  • 打赏
  • 举报
回复
两个例子

for example:
A.class Date
{
bool bValid;
...............
void f() const;
};
void Date::f() const
{
bValid = true; //错误不能改变该变量值
.............
}
B.class Date
{
mutable bool bValid;
...............
void f() const;
};
void Date::f() const
{
bValid = true; //正确 能改变该变量值
.............
}

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧