c++ - 为什么我们需要 const 方法?
问题描述
类函数 const 用于告诉编译器类函数不会更改成员变量。因此,该类型的常量对象可以安全地调用它。下面是一个简单的例子。
#include <iostream>
using namespace std;
class X {
private:
int a{1};
public:
void PrintA() const {
cout << a << "\n";
}
};
int main() {
const X x;
x.PrintA();
}
我们告诉编译器#PrintA 是常量,所以常量对象可以安全地调用它。但是,编译器似乎实际上足够聪明,可以检测函数是否为只读,与 const 关键字无关。如果我a=10
像这样在上面的代码中添加一个
#include <iostream>
using namespace std;
class X {
private:
int a{1};
public:
void PrintA() const {
cout << a << "\n";
a = 10;
}
};
int main() {
const X x;
x.PrintA();
}
我明白了
exp.cpp: In member function ‘void X::PrintA() const’:
exp.cpp:11:9: error: assignment of member ‘X::a’ in read-only object
a = 10;
换句话说, const 关键字不能诱使编译器允许常量对象的突变。所以我的问题是,为什么开发人员需要声明一个方法 const?似乎,即使没有那个提示,编译器也会区分只读和非只读方法,因此可以正确捕获尝试改变常量对象的情况。
解决方案
这不是提示——它是方法接口的一部分。如果您删除 const,PrintA 中的错误将消失,而您将在 main 中收到错误。你需要 const 的原因与你需要 public 和 private 的原因相同——定义你想要的接口。然后编译器将检查以确保您没有违反您声明的接口。
推荐阅读
- c# - .Net Core SignOut() RedirectUri 不起作用
- javascript - 在 React Native 和 Nodejs 中点击支付网关
- javascript - precacheAndRoute 在 addToCacheList 上出错
- python-3.x - 如何使用正则表达式获取此字符串的 asin?
- javascript - 我可以在 React Provider 中进行 api 调用吗?
- c# - UWP 拦截 Webview POST 请求并获取内容
- c# - 只跳一次
- oracle - 循环异常
- asp.net-core - HttpGet中name属性有什么用(如[HttpGet("/products2/{id}", Name = "Products_List")])
- akka - Akka 持久性:没有足够的 JDBC MySQL 工作示例