gpt4 book ai didi

c++ - 为什么访问函数必须是 const?漏洞在哪里?

转载 作者:太空狗 更新时间:2023-10-29 19:39:12 25 4
gpt4 key购买 nike

在我上学的时候,教授们就把它灌输到我的脑海里,同事们在代码审查时为了它跳进了我的喉咙,几乎每本 C++ 教科书中都有它:“accessor”(又名“selector”或 "getter" ) 方法必须标记为 const。如果它不更改或改变数据,则将其标记为 const

为什么?调用访问器如何修改私有(private)数据?

在下面的示例中,我设置了一个简单的类和一个访问器。 getBrand() 如何用于修改私有(private)数据?在我看来,它不能;那么为什么我们需要将其标记为 const

换句话说,我说 getBrand() 在实践中不可能用于改变私有(private)属性,我说得对吗?

例子:

#include <iostream>
#include <string>

class Cheese {
public:
Cheese(std::string brand):brand_(brand) {}
std::string getBrand() { return brand_; } // Intentionally not marked const
private:
std::string brand_;
};

int main() {
Cheese cheddar("Cabot clothbound");
std::cout << "Brand: " << cheddar.getBrand() << std::endl;
return 0;
}

最佳答案

实际上很简单:如果方法不是 const,您将无法在 const 对象上使用它 - 但您确实希望能够使用它。对于你的类(class),你无法实现

void print_brand(const Cheese& cheese);

(除非你进行 const-cast,这是你不应该做的)。

此外,如果您确实将其设为常量,而不是返回您的字符串的拷贝——它可能会或可能不会被优化掉,您可以实现:

const std::string& getBrand() const { return brand_; }

它返回一个引用,或者可能是

std::string_view getBrand() const { return brand_; }

不会将您的 API“提交”到字符串类(阅读关于 string_view here ;它仅在 C++17 中正式添加到语言中,但可作为 std::experimental::string_view 使用最近的编译器)。

关于c++ - 为什么访问函数必须是 const?漏洞在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44935159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com