在C++中使用const的正确方法是什么?

Mat*_*att 5 c++ const const-correctness

const正确让我有些困惑.

您使用什么经验法则来决定什么时候应该是const?

例如,考虑这个例子

class MyClass
{
  string ToString(); // this one?
  const string& ToString(); // or this? 
  const string& ToString() const; // or this?

  char* ToString(); // What about this?
  const char* ToString(); // or this?
  const char* ToString() const; // or this?
  const char const* ToString(); // Is this legal?
  const char const* ToString() const; // how about this?
  char const* ToString();  // or even this?
};
Run Code Online (Sandbox Code Playgroud)

Const可能会让人感到困惑.

所有这些ToString方法之间有什么区别?

如果我理解正确,第一个返回一个新的字符串对象,如果需要可以修改.第二个返回一个常量引用,也许它应该是字符串const和ToString().第三个可能是废话,因为引用总是不变的是正确的吗?

以为我会把旧的char*版本放在那里进行比较,因为我有返回对象指针的方法,我不确定它们是否应该是const.

我想我只是想了解const正确性的局限性和好处,以及如何预先确定某些东西是否应该是const以及如何正确地应用const,因为将const放在不同的位置会改变含义.

编辑:另外,我如何处理'...丢弃限定符'.这究竟意味着什么?

Zoo*_*oba 2

使用的位置const取决于该函数的目的。正如詹姆斯在他的评论中建议的那样(值得作为答案),放在const任何你可以的地方:

如果函数旨在修改其对象实例内的状态,请勿将其放在const签名的末尾。

如果函数打算修改其引用或指针参数之一,则不要添加const该参数。

如果应该修改指针或引用引用变量,则不要添加const类型(记住,const适用于紧邻之前的定义部分)。

如果返回的引用/指针引用了不应由接收到的变量更改的变量,放置const该类型。

如果不知道函数的用途,就不可能回答问题中给出的示例。我的倾向是使用string ToString() constand char* ToString() const,并且有非常明确的文档说明谁delete负责char*.


作为额外说明,const char*char const*是相同的(指向不可修改字符的指针)。char* const另一方面,是指向可修改字符的不可修改指针。