可能重复:
what is the difference between const int*, const int * const, int const *
我有一个cpp代码,我在阅读时遇到了麻烦。 B类定义为
现在,我理解前两行,但其余的不够清楚
行“B const * pa2 = pa1”是否定义了类B类的常量变量?
如果是这样,下一行会做什么?
B a2(2);
B *pa1 = new B(a2);
B const * pa2 = pa1;
B const * const pa3 = pa2;
另外,我无法弄清楚这两者之间的区别:
char const *cst = “abc”;
const int ci = 15;
谢谢
答案 0 :(得分:3)
取自C++ FAQ lite:
你必须从右到左阅读指针声明。
答案 1 :(得分:1)
此代码声明了一个指向常量B
的指针 - 换句话说,它不能用于更改它指向的值:
B const * pa2 = pa1;
或者,以下代码声明了一个指向常量B
的常量指针 - 因此,pa3
不能用于更改其指向的值,并且无法修改为指向别的东西:
B const * const pa3 = pa2;
This page包含对const
指针的解释。
解决第二个问题,
char const *cst = “abc”;
- 声明一个指向常量char的指针 - 在这种情况下,它是字符串“abc”。
const int ci = 15;
- 声明一个不能更改的常量整数15
。
答案 2 :(得分:0)
第二个代码片段显示了一种更改类型和const的顺序而不会产生任何不同的方法:顺序无关紧要。
在第一个代码片段中,第三个变量的“const”表示您无法更改指向使用该指针的对象。在相同的代码片段中,最后一个变量的另一个const表示您不能将指针重置为指向另一个对象。就此而言,它是一个常量变量和一个指针,它不允许更改指向的对象。
为了说明使用第一个代码片段的变量的第二个代码片段的问题 - 您可以更改第三个和下一个变量的第一个代码段中的类型顺序和“const”,而不会产生任何不同:< / p>
const B * pa2 = pa1; // Same
const B * const pa3 = pa2; // Same
答案 3 :(得分:0)
C ++中的基本规则是const
将“constness”(您无法更改)应用于对象的 left 部分。例外是申报行的最前面。如果const
存在,则它适用于右侧对象的部分。
这一行:
B const * pa2 = pa1;
表示“pa2是指向类型B的常量对象的指针,其中(指针)pa1被指定为其初始指针值”。
该行:
B const * const pa3 = pa2;
表示“pa3是指向类型B的常量对象的常量指针。它指向我们初始化pa2指向的同一个对象。”
许多(如果不是大多数)人都喜欢尽可能地将const
放在线的前面,因为他们喜欢它的读取方式。其他人(我自己和你的代码作者)不喜欢处理语法异常,而更喜欢把它放在对象的右边。
关于此主题的更多信息,请参阅此问题:In C++ is "const" after type ID acceptable?