繁体   English   中英

C ++中const声明的区别

[英]Difference between const declarations in C++

有什么区别

void func(const Class *myClass)

void func(Class *const myClass)

也可以看看:

可能还有其他人......

区别在于

void func(const Class *myClass)

你指向一个你不能改变的类,因为它是const。 但你可以修改myClass指针(让它指向另一个类;这对调用者没有任何副作用,因为它的指针被复制,它只会改变你的本地指针副本)

void func(Class *const myClass)

现在,myClass指向一个可以在您无法更改参数时进行修改的类。

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

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

另外看一下我一周前问过的这个问题,它指出了一些非常有用的链接来理解const的正确性。

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

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

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

诀窍是向后阅读这些东西:

void func(const Class *myClass)

读取“myClass是指向const的类的指针”,这意味着我无法在Class中进行更改

void func(Class *const myClass)

读取“myClass是指向类的const指针”,这意味着我无法更改指针。

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

正如其他答案中所提到的,这个定义意味着参数myClass指向一个Class的实例,该实例可能不被函数修改( mutableconst_cast除外)。 但是,函数体中的myClass变量可以更改为指向不同的Class实例。 这是该功能的实现细节。

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

另一方面,这个定义意味着myClass参数是一个指向不是const的Class实例的指针,因此可以被函数用来完全操作类实例,但是myClass指针变量本身不能改为指向函数体中的其他任何东西。

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

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

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 ++的生活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM