我很难理解各个地方之间的区别,你可以把'const'放在c ++的函数声明中。
开头的const之间有什么区别:
const int MyClass::showName(string id){
...
}
最后的const就像:
int MyClass::showName(string id) const{
...
}
此外,在开头和结尾都有这样的结果是什么:
const int MyClass::showName(string id) const{
...
}
答案 0 :(得分:24)
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
,则会出现编译错误。
第三是上述两种情况的结合。
答案 1 :(得分:11)
const
适用于返回值。由于复制了返回值,因此它是一个毫无意义的声明,无论你是否包含它都没有区别。const
表示该函数不会修改未标记为可变对象的任何状态。这是一个const成员函数,如果你有一个const对象,编译器将不允许你在const对象上调用非const成员函数。 const
的这两种用法之间没有相互作用 - 它们是完全独立的构造
答案 2 :(得分:4)
不同之处在于const
适用于不同的事物。
这表示showName
返回一个常量int
值 - 一个不可变的值。当然,由于int
是按值返回的,因此const
的存在不起任何作用。
const int MyClass::showName(string id)
这表示showName
不会修改MyClass
的可观察状态(技术上:它不会修改任何未声明为mutable
的成员),因此您被允许将其命名为const MyClass
类型的值。
int MyClass::showName(string id) const
如果同时使用const
,则上述两种情况均适用。
答案 3 :(得分: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 pointerToPointer
找到。同时第二个说明指向const int指针的类型指针的对象也是const,并且该对象是pointerToPointer
。
在OP的案例中:
int const MyClass::showName(string id){
...
}
const的类型是int,const是函数的返回值。
同时
int MyClass::showName(string id) const {
...
}
这里const的类型是函数(字符串)返回int,而const是函数本身,即函数体。