【问题标题】:putting 'const' before declaring function in a class [duplicate]在类中声明函数之前放置“const”[重复]
【发布时间】:2018-03-15 17:52:53
【问题描述】:

我对以下代码有疑问。当它在类中声明函数 get_name() 时,将 const 放在它前面的目的是什么。如果我把它取下来会怎样?

class College

{

string name;

const string get_name()

{ return name; }

void set_name(string n)

 { name = n; }

};

int main()

{

   College college_obj;

    return 0;

}

【问题讨论】:

  • 你介意告诉我在什么情况下这个 'const' 会有所作为吗?
  • 我的建议是:始终将 const 放在它所指的右侧(int const nint const* ptrint * const cptr)。一开始可能看起来不熟悉,但避免混淆 const 所属的位置。当然,你也需要能够反过来阅读,但你会换个思路……
  • std::string const get_name() vs. std::string get_name() const - 第一个变体: const 指的是字符串,第二个: 指整个函数。你不同意这样更清楚吗?

标签: c++


【解决方案1】:
const string get_name()

表示返回值为常量对象。它可以防止函数的调用者在临时返回值上调用非常量方法,例如

x.get_name() = "bla"
x.get_name()[0] = 'a';

不会编译。

我认为主要动机之一是防止意外分配,例如在 if 语句中:

if (x.get_name() = "John Doe"))

It has been a guideline for some time,但 C++11 通过引入右值引用和移动语义使其过时。

在您的示例中,ypu 可能应该返回对name 的常量引用。这将为您节省临时对象的创建并保留 const 的好处。并且该方法应该声明为const,因为它不会修改对象的状态。

const& get_name() const { return name; };

【讨论】:

  • 我明白了!非常感谢。
【解决方案2】:

我要补充一下

const string get_name()

不知何故没有意义,因为它返回一个新对象。为什么要声明这个const
好吧,当然总是有原因的,但我通常不会使用它。

在返回引用时,const 的使用更为重要。然后你会区分:

const string& get_name() const;

string& get_name();

【讨论】:

  • 防止意外修改临时返回值,例如if (x.get_name() = "John Doe")x.get_name()[0] = 'a'.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多