我正在审核一些代码,遇到了一些我不熟悉的代码。经过一番搜索,我没有找到任何关于为什么要这样做或者声明的好处的例子。
myClass const * const myPtr = myClass->getPointer();
这是一个const指针的声明吗,还是完全不同的东西?
myPtr
是一个指向const
myClass
的const
指针"。这意味着你既不能通过该指针修改指向的对象,也不能在初始化后(通过myClass->getPointer()
的返回值)使指针指向其他地方。所以没错,你基本上是正确的,只是还要加上它还指向一个const
对象(就目前而言;它在底层可能真的不是const
)。const
应用于其左侧的项(如果没有左侧的项,则应用于其右侧的项)。第一个const
将myClass
设置为const
(无法修改指针所指向的内容),第二个const
将*
设置为const
(无法修改指针本身)。在某些情况下,您可能会看到它被写成这样:
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
const Object * obj;
,对吧? - Scrontchconst
关键字应用于其左侧的“单词”,除非它是行首的第一个单词,在这种情况下,它适用于其右侧的“单词”。因此:myClass const * const
:myClass <- const,pointer <- const,const指向const myClass的指针。const myClass * const
。我不知道为什么,因为现在你必须考虑到“const适用于左侧的单词,除非它是行首的第一个单词”的例外情况。即:以代码审查中使用的方式编写行更加清晰。这声明了一个常量指针,指向通过解引用指针myClass
调用成员函数返回的常量值。
第一个const
是有效的使用,而第二个const
在我看来是多余的。
当你使用
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();
没有任何危害。