9

和有什么区别

void func(const Class *myClass)

void func(Class *const myClass)

也可以看看:

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

4

6 回答 6

21

不同之处在于,对于

void func(const Class *myClass)

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

void func(Class *const myClass)

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

于 2009-01-28T09:56:23.643 回答
12

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

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

也看看我一周前问的这个问题,它指向一些非常有用的链接来理解 const 的正确性。

于 2009-01-28T09:57:12.443 回答
5

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

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

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

于 2009-01-28T10:06:46.680 回答
2

诀窍是向后阅读这些内容:

void func(const Class *myClass)

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

void func(Class *const myClass)

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

于 2009-01-28T10:11:33.287 回答
2
void func(const Class *myClass) { //...

如其他答案中所述,此定义意味着参数myClass指向的实例Class可能不会被函数修改(mutableconst_cast除外)。但是,myClass函数体中的变量可以更改为指向Class. 这是函数的实现细节。

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

另一方面,此定义意味着myClass参数是指向Class非 const 实例的指针,因此函数可以使用它来完全操作类实例,但myClass指针变量本身不能更改为指向函数体。

其他答案未提出的重要一点是,对于函数签名,在考虑函数类型时,任何顶级 const 或 volatile 限定都将被忽略。这是因为参数总是按值传递的,所以是否为 const 只影响参数本身是否可以在函数体中改变,而不能影响调用者。

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

void func(Class *const myClass);

void func(Class *myClass);
于 2009-01-28T10:50:47.717 回答
1

在 C++ 这个

const MyClass *ptr 

还有这个

MyClass const *ptr

两者都意味着这ptr是一个指向类型常量对象的变量指针。也就是说,您不能通过. 但是,您可以使自己指向.MyClassptrptrMyClass

相比之下,这

MyClass *const ptr

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

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

于 2009-01-28T10:02:51.027 回答