C++中const声明的不同之处

10
6个回答

22

区别在于

void func(const Class *myClass)

您指向了一个常量类,而您无法更改它。 但是您可以修改myClass指针(让它指向另一个类;这不会对调用者产生任何副作用,因为指针被复制,它只会更改您本地的指针副本)。 相比之下

void func(Class *const myClass)
现在,myClass指向一个可以被修改的类,而你无法改变参数。

13
在第一个中,你声明了一个函数,它接受一个指向常量Class对象的指针。你不能在函数内修改对象。
在第二个中,你声明了一个函数,它接受一个常量指针,指向一个非常量的Class对象。你可以通过指针修改对象,但不能修改指针值本身。
我始终记住这个简单的规则:const总是应用于它左边的东西,如果不存在这个东西,它就应用于右边的东西。
另外请看一下我一周前提出的这个问题,它指向了一些非常有用的链接,以便理解const正确性。

1
+1 对于一个好的答案和如何记住常量性的提示,这是我也使用的方法。 - xan

5

一个经验法则是从右到左阅读声明:

void func(const Class *myClass) 是指向 const Class(或严格来说是“指向一个 const 类的指针”)

void func(Class *const myClass) 是指向 Class 的 const 指针


对于非常宽松的定义,可以将其理解为从右到左。严格来说,第一个更像是“指向一个类的常量指针”。 - Nate Parsons
这个规则在看到这个时候就会被打破:MyClass const *ptr - Frederick The Fool
drhorrible: 如果你想要严谨的话,那就是一个常量类。Frederick: 为什么?指向常量MyClass的指针?看起来很简单。 - jalf

2

诀窍在于反向阅读:

void func(const Class *myClass)

读作“myClass是指向常量Class的指针”,这意味着我不能更改Class。

void func(Class *const myClass)

读作“myClass是指向Class的常量指针”,这意味着我不能更改指针。


2
void func(const Class *myClass) { //...

如其他答案所述,此定义意味着参数myClass指向一个Class实例,该实例可能在函数内部不能被修改(mutableconst_cast除外)。但是,函数体中的myClass变量可以更改为指向另一个Class实例。这是函数的一项实现细节。
void func(Class *const myClass) { // ...

另一方面,这个定义意味着myClass参数是指向一个非const的Class实例的指针,因此函数可以完全操作类实例,但是在函数体内myClass指针变量本身不能被改变指向其他任何东西。
另外,需要强调的一点是,在函数签名中,任何顶层const或volatile限定符在考虑函数类型时都会被忽略。这是因为参数总是按值传递,所以它们是否是const只影响参数本身是否可以在函数体内更改,而不能影响调用者。
因此,这两个函数声明是等效的。
void func(Class *const myClass);

void func(Class *myClass);

1

在C++中,这样做

const MyClass *ptr 

和这个

MyClass const *ptr

两者都意味着ptr是指向MyClass类型的常量对象的变量指针。也就是说,你不能通过ptr改变该对象。但是,你可以使ptr本身指向MyClass的其他对象。

相比之下,这个

MyClass *const ptr

意味着ptr是一个指向变量MyClass对象的常量指针。在这里,您确实可以更改ptr所指向的对象,但不能使ptr指向其他对象。

请注意,在上述三种语法中,第二种语法有点奇怪,但它是有效的语法。它不遵循其他人建议的从左到右的阅读规则。但这就是C++中的生活。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接