C++常量指针声明

26

我正在审核一些代码,遇到了一些我不熟悉的代码。经过一番搜索,我没有找到任何关于为什么要这样做或者声明的好处的例子。

myClass const * const myPtr = myClass->getPointer();

这是一个const指针的声明吗,还是完全不同的东西?

6个回答

34
这意味着"myPtr是一个指向constmyClassconst指针"。这意味着你既不能通过该指针修改指向的对象,也不能在初始化后(通过myClass->getPointer()的返回值)使指针指向其他地方。所以没错,你基本上是正确的,只是还要加上它还指向一个const对象(就目前而言;它在底层可能真的不是const)。
请记住,const应用于其左侧的项(如果没有左侧的项,则应用于其右侧的项)。第一个constmyClass设置为const(无法修改指针所指向的内容),第二个const*设置为const(无法修改指针本身)。

8
记住,const应用于其左侧的项(如果左侧没有项,则应用于其右侧的项)- 这是分类const的最佳、最简单、最易于理解的经验法则。 - linbianxiaocao

29

在某些情况下,您可能会看到它被写成这样:

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;,对吧? - Scrontch

4
规则是const关键字应用于其左侧的“单词”,除非它是行首的第一个单词,在这种情况下,它适用于其右侧的“单词”。因此:myClass const * const:myClass <- const,pointer <- const,const指向const myClass的指针。
由于某种原因,在大多数代码(至少我见过的代码中),这将被声明为const myClass * const。我不知道为什么,因为现在你必须考虑到“const适用于左侧的单词,除非它是行首的第一个单词”的例外情况。即:以代码审查中使用的方式编写行更加清晰。

1

这声明了一个常量指针,指向通过解引用指针myClass调用成员函数返回的常量值。


1
Seth说得对。你可能还会对Duramecho的一些背景信息感兴趣。

1
只提供链接的回答是不被赞同的。即使外部资源失效或移动,此回答仍然有效。 - bolov

0

第一个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();

没有任何危害。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接