刨根问底系列之C++ const 挖掘(二)

2014-11-24 10:28:04 · 作者: · 浏览: 1
include
using namespace std;

const int MAX_FRIEND = 100;
class Player{
public:
enum {
boy = 1,
girl = 0
};
Player() : user_id_(0), user_sex_(boy){}
~Player(){}

Player(const Player&);
const Player& operator=(const Player&);

void SetUserId(int user_id);
int GetUserId() const;

void SetGroupId(int group_id) const;
int GetGroupId() const;

void SetUserAge(int user_age) const;
int GetUserAge() const;

void SetUserName(const char* user_name);
void PrintPlayerInfo() const;

private:
int user_id_;
mutable int group_id_;
int user_age_;
string user_name_;
const char user_sex_;
static const int friend_count_ = MAX_FRIEND;
};

Player::Player(const Player& player):user_sex_(boy) {

}

const Player& Player::operator=(const Player& other) {

}

void Player::SetUserId(int user_id) {
user_id_ = user_id;
}

int Player::GetUserId() const {
return user_id_;
}

void Player::SetUserAge(int user_age) const {
const_cast(this)->user_age_ = user_age;
}

int Player::GetUserAge() const {
return user_age_;
}
void Player::SetGroupId(int group_id) const {
group_id_ = group_id;
}

int Player::GetGroupId() const {
return group_id_;
}

void Player::SetUserName(const char* user_name) {
user_name_ = user_name;
}

void Player::PrintPlayerInfo() const {
cout<<"user id:\t"< cout<<"user name:\t"< cout<<"user sex:\t"< cout<<"user age:\t"< cout<<"user group:\t"< }
int main() {
const Player player1;
//player1.SetUserId(100001);
player1.GetUserId();

Player player2;

player2.SetUserId(100001);

player2.SetGroupId(100);

player2.SetUserAge(21);

player2.SetUserName("Jack");

player2.PrintPlayerInfo();
return 0;
}

通过例子2.3可以看出const objects只能读取内存的值,不能改写内存的值。对于const member function,member data group_id_ 是按逻辑申明的可改变变量。而在SetUserAge(int user_age)函数里通过强转this指针,来改变member data。

文章里所示程序在gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)环境里编译通过,全文完。

参考:

c++ 编程思想卷一

effective c++ 第三版