什么是两者之间的区别?
void func(const Class *myClass)
并且
void func(Class *const myClass)
参见:
可能还有其他相关内容...
void func(const Class *myClass)
并且
void func(Class *const myClass)
参见:
可能还有其他相关内容...
区别在于
void func(const Class *myClass)
您指向了一个常量类,而您无法更改它。 但是您可以修改myClass指针(让它指向另一个类;这不会对调用者产生任何副作用,因为指针被复制,它只会更改您本地的指针副本)。 相比之下
void func(Class *const myClass)
现在,myClass指向一个可以被修改的类,而你无法改变参数。const
总是应用于它左边的东西,如果不存在这个东西,它就应用于右边的东西。一个经验法则是从右到左阅读声明:
void func(const Class *myClass)
是指向 const Class(或严格来说是“指向一个 const 类的指针”)
void func(Class *const myClass)
是指向 Class 的 const 指针
诀窍在于反向阅读:
void func(const Class *myClass)
读作“myClass是指向常量Class的指针”,这意味着我不能更改Class。
void func(Class *const myClass)
读作“myClass是指向Class的常量指针”,这意味着我不能更改指针。
void func(const Class *myClass) { //...
myClass
指向一个Class
实例,该实例可能在函数内部不能被修改(mutable
和const_cast
除外)。但是,函数体中的myClass
变量可以更改为指向另一个Class
实例。这是函数的一项实现细节。void func(Class *const myClass) { // ...
myClass
参数是指向一个非const的Class
实例的指针,因此函数可以完全操作类实例,但是在函数体内myClass
指针变量本身不能被改变指向其他任何东西。void func(Class *const myClass);
void func(Class *myClass);
在C++中,这样做
const MyClass *ptr
和这个
MyClass const *ptr
两者都意味着ptr
是指向MyClass
类型的常量对象的变量指针。也就是说,你不能通过ptr
改变该对象。但是,你可以使ptr
本身指向MyClass
的其他对象。
相比之下,这个
MyClass *const ptr
意味着ptr
是一个指向变量MyClass
对象的常量指针。在这里,您确实可以更改ptr
所指向的对象,但不能使ptr
指向其他对象。
请注意,在上述三种语法中,第二种语法有点奇怪,但它是有效的语法。它不遵循其他人建议的从左到右的阅读规则。但这就是C++中的生活。