常量变量的值可以通过指针技巧来改变,但是可以做这样的事情:
class A (){
int x;
public:
void func () const {
//change value of x here
}
}
答案 0 :(得分:23)
声明x
mutable
class A (){
mutable int x;
public:
void func () const {
//change value of x here
}
};
答案 1 :(得分:10)
您有两种选择:
class C
{
public:
void const_f() const
{
x = 5; // A
auto* p_this = const_cast<C*>(this); // B
p_this->y = 5;
}
private:
mutable int x; // A
int y;
};
this
指针中删除constness。答案 2 :(得分:4)
虽然不理解这一点,但是C ++提供的“后门”可以用来破坏自己的规则,就像脏指针技巧一样。无论如何,您可以通过使用“This”指针的转换版本轻松完成此操作:
class A (){
int x;
public:
void func () const {
//change value of x here
A* ptr = const_cast<A*> (this);
ptr->x= 10; //Voila ! Here you go buddy
}
}
答案 3 :(得分:3)
这里要了解的最重要的事情是bitwise/physical/concrete const
ness and conceptual/meaningwise/logical/abstract const
ness。
简而言之:
const
,请创建成员数据mutable
。const
。答案 4 :(得分:1)
只是施放'this',这将是一种实施程序的肮脏方式,如果您正在进行项目或团队合作,请避免这种情况,因为其他人会对此感到困惑。
class CAST_CLASS (){
int var;
public:
void change_CAST () const {
CAST_CLASS* pointer = const_cast<CAST_CLASS*> (this);
pointer->var= 10;
}};
答案 5 :(得分:0)
其他答案未提及此问题,但以下内容也修改了“ x”(肯定是不建议的):
class A {
int x, &y{x}, *z{&x};
public:
void func () const
{
y = 42; // x is modified now!
*z = 29; // x is modified again!!
}
};