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标记和指针的表达式时,总是尝试从右到左阅读它们(在应用上面的转换之后).所以在这种情况下,返回值是一个指向constint的const指针.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().
Yon*_*ony 12
记住规则的一个简单方法const是以这种方式思考:const适用于左边的东西,除非左边没有任何东西.
所以在这种情况下const int * const,第一个const在它的左边没有任何东西,所以它适用于int,而第二个const在它的左边有一些东西,所以它适用于指针.
此规则还告诉您在您拥有的情况下会发生什么const int const *.由于两个const适用int于此表达式都是多余的,因此无效.