之间有什么区别
void func(const Class *myClass)
和
void func(Class *const myClass)
另见:
可能还有其他人......
答案 0 :(得分:21)
不同之处在于
void func(const Class *myClass)
你指向一个你无法改变的类,因为它是const。 但你可以修改myClass指针(让它指向另一个类;这对调用者没有任何副作用,因为它的指针被复制,它只会改变你的本地指针副本) 相比之下
void func(Class *const myClass)
现在myClass指向一个可以在您无法更改参数时进行修改的类。
答案 1 :(得分:11)
在第一个中,您声明了一个接受指向常量Class对象的指针的函数。您无法修改函数内的对象。 在第二个中,您将声明一个接受指向非常量Class对象的常量指针的函数。您可以通过指针修改对象,但不能修改指针值本身。
我始终牢记这个简单的规则:const
始终适用于它左边的东西,如果这个东西不存在,它适用于右边的东西。 强>
另请查看我在一周前提出的this问题,它指出了一些非常有用的链接来理解const正确性。
答案 2 :(得分:5)
经验法则是从右到左阅读声明:
void func(const Class *myClass)
是指向const类的指针(或严格来说是“指向const的类的指针”)
void func(Class *const myClass)
是指向Class
答案 3 :(得分:2)
诀窍是向后看这些事情:
void func(const Class *myClass)
读取“myClass是指向const的类的指针”,这意味着我无法在类中进行更改
void func(Class *const myClass)
读取“myClass是指向类的const指针”,这意味着我无法更改指针。
答案 4 :(得分:2)
void func(const Class *myClass) { //...
如其他答案中所述,此定义表示参数myClass
指向Class
的实例,该实例可能未被修改(mutable
和const_cast
除外)功能。但是,函数体中的myClass
变量可以更改为指向Class
的不同实例。这是函数的实现细节。
void func(Class *const myClass) { // ...
另一方面,这个定义意味着myClass
参数是指向Class
实例的指针,该实例不是const,因此可以被函数用来完全操作类实例,但是myClass
指针变量本身不能改变为指向函数体中的任何其他内容。
其他答案未提出的一个重点是,对于函数签名,在考虑函数的类型时,忽略任何顶级const或volatile限定。这是因为参数总是按值传递,因此它们是否为常量只会影响参数本身是否可以在函数体中更改,并且不会影响调用者。
因此这两个函数声明是等价的。
void func(Class *const myClass);
void func(Class *myClass);
答案 5 :(得分:1)
在C ++中这个
const MyClass *ptr
和这个
MyClass const *ptr
两者都表示ptr
是一个变量指针,指向类型为MyClass
的常量对象。也就是说,您无法通过ptr
更改所述对象。但是,您可以将ptr
本身指向MyClass
的其他对象。
相比之下,这个
MyClass *const ptr
暗示ptr
是指向变量 MyClass
对象的常量指针。在这里,您确实可以更改ptr指向的对象,但不能使ptr
指向其他对象。
请注意,在上述三种语法中,第二种语法有点奇怪,但它是有效的语法。它没有遵循其他人建议的从左到右阅读规则。但是,那就是C ++的生活。