C ++ Const指针声明

时间:2012-03-19 23:39:36

标签: c++ pointers constants

我正在审核一些代码,并且遇到了一些我不熟悉的代码。经过一番搜索后,我无法想出为什么要这样做或者这个声明的好处。

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

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

6 个答案:

答案 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)

赛普是钱的。您可能会在Duramecho上找到更多有用的背景信息。

答案 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();

没有任何伤害。