详解按位const与按逻辑const

如果想建立一个const成员函数,但是还想在对象中改变某些数据,这时候该怎么办呢?

这种情况涉及到按位const与按逻辑const

按位const是指对象中的每个字节都应该是固定的,按逻辑const是指对象从概念上讲是不变的,但是可以以成员为单位进行改变

当某个对象是const对象时,就指定了应该按位const,但我们可以用某种方法使之改变成按逻辑const

方法一被称为“强制转换常量性”,代码如下:

//: C08:Castaway.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// "Casting away" constness

class Y {
	int i;
public:
	Y();
	void f() const;
};

Y::Y() { i = 0; }

void Y::f() const {
	//!  i++; // Error -- const member function
	((Y*)this)->i++; // OK: cast away const-ness
	// Better: use C++ explicit cast syntax:
	(const_cast<Y*>(this))->i++;
}

int main() {
	const Y yy;
	yy.f(); // Actually changes it!
} ///:~

方法二是 使用关键字mutable,以指定一个特定的数据成员可以在一个const对象中改变,代码如下:

//: C08:Mutable.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// The "mutable" keyword

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

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

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

int main() {
	const Z zz;
	zz.f(); // Actually changes it!
} ///:~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值