23

我正在努力弄清楚可以在 C++ 中的函数声明上放置“const”的各个地方之间的差异。

const开头的区别是什么:

const int MyClass::showName(string id){
...
}

最后的 const 就像:

int MyClass::showName(string id) const{
...
}

另外,像这样在开头和结尾都有 const 的结果是什么:

const int MyClass::showName(string id) const{
...
}
4

4 回答 4

36

const int MyClass::showName(string id)返回一个const int对象。所以调用代码不能改变返回的int。如果调用代码是这样的const int a = m.showName("id"); a = 10;,那么它将被标记为编译器错误。但是,正如下面@David Heffernan 所指出的,由于整数是通过复制返回的,因此调用代码没有义务使用const int. 它可以很好地声明int为返回类型并对其进行修改。由于对象是通过复制返回的,因此将返回类型声明为const int.

int MyClass::showName(string id) const告诉方法showName是一个const成员函数。const 成员函数是不修改类的任何成员变量的函数(除非它们被标记为mutable)。int m_a因此,如果您在类中有成员变量,MyClass并且如果您尝试在m_a = 10;内部进行操作showName,则会出现编译器错误。

三是以上两种情况的结合。

于 2012-05-23T09:11:47.803 回答
13
  1. const附加到返回值适用于返回值。由于返回值被复制,它是一个毫无意义的声明,无论你是否包含它都没有区别。
  2. 参数列表后面的意思是该const函数不会修改未标记为可变的对象的任何状态。这是一个 const 成员函数,如果您有一个 const 对象,编译器将不允许您在 const 对象上调用非 const 成员函数。

这两种用途之间没有相互作用const——它们是完全独立的结构

于 2012-05-23T09:10:31.597 回答
5

不同之处在于const适用于不同的事物。

这表示showName返回一个常int量值——一个不可变的值。当然,由于int是按值返回的,因此const此处的存在没有任何作用。

const int MyClass::showName(string id)

这表示showName不会修改的可观察状态MyClass(技术上:它不会修改任何未声明的成员mutable),因此您可以在 type 的值上调用它const MyClass

int MyClass::showName(string id) const

如果您同时使用这两个consts,那么上述两个都适用。

于 2012-05-23T09:12:19.317 回答
0

像这样的问题往往会增强我遵循 Dan Saks 建议的决心,正如这篇“与大师的对话”文章中所述:http ://www.drdobbs.com/conversationsa-midsummer-nights-madness/184403835 。

特别是它处理 const 的位置如何改变事物。(*) 我意识到我极不可能将任何人从写作转换const int ...int const ...,但也就是说,我更喜欢后者是有一个原因的。

(*) 包含一个注意事项,即在一开始就将 const 与类型声明交换是一个没有效果的更改。

它使可读性变得非常容易,因为对于 const声明中单词的任何实例,它左侧的所有内容都是 const 的类型,而右侧的所有内容实际上都是 const。

考虑如下声明:

int const * * const pointerToPointer;

第一个const声明指针链末尾的整数是 const,它们可以在* * const pointerToPointer. 同时,第二个声明指向 const int 的指针类型的对象也是 const 并且该对象是pointerToPointer.

在OP的情况下:

int const MyClass::showName(string id){
...
}

const 的类型是 int,而 const 是函数的返回值。

同时:

int MyClass::showName(string id) const {
...
}

这里const的类型是function(string)返回int,而const是函数本身,即函数体。

于 2017-01-20T19:31:11.407 回答