C++ C+中const声明之间的差异+;

C++ C+中const声明之间的差异+;,c++,syntax,pointers,constants,parameters,C++,Syntax,Pointers,Constants,Parameters,两者的区别是什么 void func(const Class *myClass) 及 另见: 可能还有其他人…区别在于 void func(const Class *myClass) 您指向一个不能更改的类,因为它是常量。 但是您可以修改myClass指针(让它指向另一个类;这对调用者没有任何副作用,因为它的指针是复制的,它只会更改本地指针副本) 相比之下 void func(Class *const myClass) 现在,myClass指向一个可以修改的类,而您不能更改参数。

两者的区别是什么

void func(const Class *myClass)


另见:


可能还有其他人…

区别在于

void func(const Class *myClass)
您指向一个不能更改的类,因为它是常量。 但是您可以修改myClass指针(让它指向另一个类;这对调用者没有任何副作用,因为它的指针是复制的,它只会更改本地指针副本) 相比之下

void func(Class *const myClass)

现在,myClass指向一个可以修改的类,而您不能更改参数。

在第一个类中,您声明了一个接受指向常量类对象的指针的函数。不能在函数内修改对象。 在第二个示例中,您将声明一个函数,该函数接受指向非常量类对象的常量指针。可以通过指针修改对象,但不能修改指针值本身

我总是记住一条简单的规则:
const
总是适用于它最左边的东西,如果这个东西不存在,它适用于最右边的东西。

也请看一周前我问的问题,它指出了一些非常有用的理解常态正确的链接。C++中的

< P>这个

const MyClass *ptr 
还有这个

MyClass const *ptr
两者都意味着
ptr
是一个变量指针,指向类型为
MyClass
的常量对象。也就是说,您不能通过
ptr
更改所述对象。但是,您可以使
ptr
本身指向
MyClass
的其他对象

相比之下,这

MyClass *const ptr
暗示
ptr
是指向变量
MyClass
对象的常量指针。在这里,您确实可以更改ptr指向的对象,但不能使
ptr
指向其他对象


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

经验法则是读取右边到左边的声明:

void func(const Class*myClass)
是指向const类的指针(或者严格地说是指向const类的指针)


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

技巧是向后读取这些内容:


void func(常量类*myClass)

读到“myClass是指向常量类的指针”,这意味着我不能在类中进行更改


无效函数(类*常量myClass)

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

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

void func(Class *const myClass) { // ...
另一方面,此定义意味着
myClass
参数是指向非常量的
Class
实例的指针,因此函数可以使用它来完全操作类实例,但是,
myClass
指针变量本身不能更改为指向函数体中的任何其他对象

其他答案没有提到的一个重要问题是,对于函数签名,在考虑函数类型时,忽略任何顶级常量或volatile限定。这是因为参数总是按值传递的,所以它们是否为常量只会影响参数本身是否可以在函数体中更改,而不会影响调用方

因此,这两个函数声明是等价的

void func(Class *const myClass);

void func(Class *myClass);

+1对于一个好的答案和如何记住常量的技巧,我也使用了这个。对于右->左的非常松散的定义。严格地说,第一个看起来更像是指向Meth的“指向类常量的指针”。这条规则在看到以下内容时崩溃:MyClass const*ptrdrhorrible:“一个常量类”,如果你想学究的话弗雷德里克:为什么?指向常量MyClass的指针?看起来很简单。
void func(Class *const myClass);

void func(Class *myClass);