这是一个理解在下面的场景中实现get函数的正确方法的问题。
我得到了以下课程:
class A
{
string m_sName;
public:
A(): m_sName ("this") {}
const string& getName() const
{
return m_sName;
}
};
上面执行get函数的问题是,它允许客户端修改数据成员。也就是说' S:
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;
}
输出将是:this Pointer
我知道我们可以使用引用参数来获取函数或只是返回字符串。但两者都会创造新的对象。
有更好的方法吗?或者禁止const_cast(在用户定义的类上)?
答案 0 :(得分:7)
C ++让你有能力用脚射击自己。
程序员应该极其谨慎地使用const_cast
:意识到使用它来抛弃最初声明为const
的对象上的const
的行为是 undefined
代码分析工具可以帮助您。
答案 1 :(得分:4)
只需按值返回
即可完全避免此问题 string getName() const
答案 2 :(得分:0)
添加另一个版本的getName(),它没有被标记为const方法,并返回一个非常量字符串&amp;:
的字符串&安培; getName(){return m_sName; }
这将返回对A实例中字符串的引用,并且不会创建副本。然而,它会修改类中的字符串。
我应该指出,在封装和数据隐藏方面,这是用OO术语做错事的错误方法。你的班级如何存储名称的抽象泄露给外界。正确的方法是添加UpdateName或AppendToName方法。