C++ 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&

这是一个理解以下场景中实现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& 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线