C++ get函数中的返回值
这是一个理解以下场景中实现get函数的正确方法的问题 我得到了以下等级:C++ get函数中的返回值,c++,C++,这是一个理解以下场景中实现get函数的正确方法的问题 我得到了以下等级: class A { string m_sName; public: A(): m_sName ("this") {} const string& getName() const { return m_sName; } }; 上述get函数实现的问题是,它允许客户端修改数据成员。那就是: int main () { A a; const string&
class A
{
string m_sName;
public:
A(): m_sName ("this") {}
const string& getName() const
{
return m_sName;
}
};
上述get函数实现的问题是,它允许客户端修改数据成员。那就是:
int main ()
{
A a;
const string& data_mem = a.getName();
string& s = const_cast<string&> (data_mem);
s += " Pointer";
cout << a.getName().c_str () << endl;
return 0;
}
int main()
{
A A;
常量字符串和数据_mem=a.getName();
字符串&s=常量转换(数据存储);
s+=“指针”;
coutC++可以让你射中自己的脚
程序员在使用const_cast
时应格外小心:要知道,在最初声明为const
的对象上,使用它来丢弃const
的行为是未定义的
代码分析工具可以帮助您。只需按值返回即可完全避免问题
string getName()const
添加另一个未标记为const方法的getName()版本,并返回一个非常量字符串&:
string&getName(){return m_sName;}
这将返回对实例中字符串的引用,并且不会创建副本。但是,它将修改类中的字符串
我应该指出,从封装和数据隐藏的角度来看,这是用OO做事情的错误方法。您的类对名称存储方式的抽象正在泄漏到外部世界。正确的方法是添加UpdateName或AppendName方法。真的,如果客户端代码是const\u cast
试图o修改不应修改的数据,他们会要求发生任何破坏。没有人强迫你使用const\u cast
。如果你不喜欢它的功能,就不要使用它。#定义const\u cast/*empty*/。不幸的是,这是非标准的,但仍然..如果你不相信你的用户不使用const\u cast'ing,那么就给他们一份副本。第一步t线