C++ Const用法解释

RoR*_*RoR 93 c++ const

const int* const Method3(const int* const&) const;
Run Code Online (Sandbox Code Playgroud)

有人可以解释每个const的用法吗?

ild*_*arn 101

如果将其重写为完全等效的,则更容易理解

// v???v???v???v???v???v???v???v???v???v???v???v???
//                                               ??
//  v??#1    v?#2             v??#3    v?#4      #5
   int const * const Method3(int const * const&) const;
Run Code Online (Sandbox Code Playgroud)

然后从右到左阅读.

#5表示左边的整个函数声明const,这意味着它必然是一个成员函数而不是一个自由函数.

#4表示左边的指针是const(可能不会改为指向不同的地址).

#3表示int左边是const(可能不会更改为具有不同的值).

#2表示左边的指针是const.

#1表示int左边是const.

将它们放在一起,您可以将其读作一个const名为的成员函数Method3,该函数接受一个const指向int const(或者const int,如果您愿意)的const指针并返回指向int const(const int)的指针.

(Nb#2 完全是多余的.)


bri*_*ler 73

阅读:https://isocpp.org/wiki/faq/const-correctness

最后const意味着该函数Method3不会修改其类的非可变成员.

const int* const表示一个指向常量int的常量指针:即一个无法更改的指针,一个无法更改的int:const int&它之间的唯一区别是它可以是null

const int* const&表示对常量int的常量指针的引用.通常指针不通过引用传递; const int* &更有意义,因为它意味着在方法调用期间可以更改指针,这是我可以看到通过引用传递指针的唯一原因const int* const&,const int* const除了它可能效率低之外,所有意图和目的都是相同的因为指针是普通旧数据(POD)类型,这些通常应该通过值传递.


Ale*_*ler 22

首先const T相当于T const.

const int* const因此相当于int const * const.

当读取包含许多const标记和指针的表达式时,总是尝试从右到左阅读它们(在应用上面的转换之后).所以在这种情况下,返回值是一个指向constintconst指针.const由于返回值不是可以修改的左值,因此使指针本身没有任何意义.const但是,建立指针可以保证调用者不会修改返回的int(或ints 数组)Method3.

const int*const&变成了int const*const&,所以它是对const的const指针int引用.通过引用传递const指针也没有任何意义 - 你不能修改引用的值,因为指针是const,引用和指针占用相同的存储空间,所以也没有任何空间节省.

最后一个const表示该方法不修改this对象.this方法体内的指针将具有(理论上)声明T const * const this.这意味着const T*对象将能够调用T::Method3().

  • 投票给这个(和ildjarn的类似答案),部分是为了说明如果你不把第一个`const`s放在短语的头部,整个事情会更有意义.这就是为什么我认为将`const`放在那里是不好的做法,即使语言允许它,它也是最常见的用法. (2认同)

Yon*_*ony 12

记住规则的一个简单方法const是以这种方式思考:const适用于左边的东西,除非左边没有任何东西.

所以在这种情况下const int * const,第一个const在它的左边没有任何东西,所以它适用于int,而第二个const在它的左边有一些东西,所以它适用于指针.

此规则还告诉您在您拥有的情况下会发生什么const int const *.由于两个const适用int于此表达式都是多余的,因此无效.