我正在审核一些代码,并且遇到了一些我不熟悉的代码。经过一番搜索后,我无法想出为什么要这样做或者这个声明的好处。
myClass const * const myPtr = myClass->getPointer();
这是一个const指针的声明还是完全不同的东西?
答案 0 :(得分:27)
这意味着“myPtr
是指向const
const
”的myClass
指针。这意味着你既不能通过这个指针修改指针指向的内容,也不能在初始化之后使指针指向其他地方(通过返回值{{ 1}})。所以是的,你基本上是正确的,另外它还指向一个myClass->getPointer()
对象(据你所知;它可能真的是非 - const
下面的。)
请记住,const
适用于其左侧的项目(或者左侧没有项目,右侧是项目)。第一个const
生成const
myClass
(您无法修改指针指向的位置),第二个const
生成const
const(其中)你无法修改指针本身。)
答案 1 :(得分:22)
在某些情况下,您可能会看到它是这样写的:
const myClass * const myPtr = myClass->getPointer();
这两个是等价的,即一个指向常量对象的常量指针。我更喜欢你所显示的语法,因为从右到左阅读新手时更容易理解:
Object * const obj; // read right-to-left: const pointer to Object
Object const * obj; // read right-to-left: pointer to const Object
Object const * const obj; // read right-to-left: const pointer to const Object
答案 2 :(得分:4)
规则是const
关键字适用于左侧的“单词”,除非它是该行的第一个单词,在这种情况下它适用于右侧的“单词” 。所以:myClass const * const
:myClass< - const,pointer< - const,const指向const myClass的指针。
出于某种原因,在大多数代码中(至少是我见过的代码),这将被声明为const myClass * const
。为什么我没有任何线索,因为现在你必须考虑到“const适用于左边的单词,除非它是第一个单词在线”的例外。即:在你正在审查的代码中完成它们的写作方式更加清晰。
答案 3 :(得分:1)
这声明了一个指向常量值的常量指针,通过调用解除引用指针myClass
答案 4 :(得分:1)
答案 5 :(得分:0)
第一个const
是有效的使用,而第二个const
是多余的IMO。
使用时
myClass const * const myPtr = myClass->getPointer();
您无法更改myPtr
指向的对象。
您无法更改myPtr
所指向的位置。
myPtr->SomeMember = SomeValue; // Not allowed. That's OK.
// The state of myClass is protected.
myPtr = nullptr; // That's not allowed either.
// I don't think it is necessary to disallow this.
您应该可以使用
myClass const * myPtr = myClass->getPointer();
没有任何伤害。