get函数中的返回值

时间:2016-06-21 07:28:13

标签: c++

这是一个理解在下面的场景中实现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(在用户定义的类上)?

3 个答案:

答案 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方法。