C++ mutable 关键字的使用场景
2023-12-23 21:50:46
mutable
用于修饰类的成员变量,表示该成员变量可以在被标记为 const 的成员函数内修改。
1、常函数的概念
在 C++ 中,将成员函数标记为 const 有两个主要目的:
-
约定和安全性: 使用 const 关键字是为了表达一个承诺,即该成员函数不会修改对象的状态,这增加了对于程序员来说的可读性。在 const 成员函数内部,编译器也会强制禁止修改非 mutable 的成员变量。
-
允许 const 对象调用: const 成员函数可以被 const 对象调用,而非 const 成员函数不能被const对象调用。
-
假设有一个类 Person:
class Person { public: // 普通成员函数 void setName(const std::string& newName) { name = newName; } // const 成员函数 std::string getName() const { return name; } private: std::string name; };
在这个例子中,
setName
是一个普通的成员函数,而getName
被标记为 const。现在,假设你创建了一个 常对象和一个普通对象,并用这两个对象调用普通成员函数SetName
,很明显常量对象不能调用普通成员函数(这样做违反了 const 对象的语义,即不修改对象的外部状态。)const Person constPerson; Person nonConstPerson; constPerson.setName("Alice"); // 错误,const 对象不能调用非 const 成员函数 nonConstPerson.setName("Bob"); // 正确
尝试使用这两个对象调用常函数
getName
,都可以成功:std::cout << constPerson.getName() << std::endl; // 正确,const 对象可以调用 const 成员函数 std::cout << nonConstPerson.getName() << std::endl; // 正确
-
2、使用mutable的场景
考虑这样的场景如何实现:有一个狗类,它可以狗叫,并且每次狗叫,都把他狗叫次数+1,这个狗可以是const狗,也可以是非const狗
#include <iostream>
class Dog {
public:
Dog() {}
void Barking(){
std::cout << "我在狗叫" << "\n";
++count;
}
int GetBarkingCount() const {
return count;
}
private:
int count = 0;
};
int main()
{
// 创建普通狗,并狗叫
Dog nonConstDog;
nonConstDog.Barking();
nonConstDog.Barking();
std::cout << "普通狗狗叫次数" << nonConstDog.GetBarkingCount() << "\n"; // 2次
// 创建常量狗,并狗叫
const Dog constDog;
constDog.Barking(); // error 常量狗不能用普通狗叫,
std::cout << "常量狗狗叫次数 " << constDog.GetBarkingCount() << "\n";
return 0;
}
可以看到,如果这样写代码,常量狗是不配狗叫的,如果用上mutable
,并且把狗叫函数改为const,就能很方便的实现了
class Dog {
public:
Dog() {}
void Barking() const {
std::cout << "我在狗叫" << "\n";
++count;
}
int GetBarkingCount() const {
return count;
}
private:
mutable int count = 0;
};
如果不用mutable怎么实现?我暂时没想到- - 欢迎评论区补充。
文章来源:https://blog.csdn.net/Motarookie/article/details/135173248
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!