consts和其他动物

时间:2010-06-10 13:32:40

标签: c++ class const constants

  

可能重复:
  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;


谢谢

4 个答案:

答案 0 :(得分:3)

取自C++ FAQ lite

你必须从右到左阅读指针声明。

  • Fred const * p表示“p指向常量Fred”:Fred对象无法通过p进行更改。
  • Fred * const p表示“p是指向Fred的const指针”:您不能更改指针p,但可以通过p更改Fred对象。
  • Fred const * const p表示“p是指向常量Fred的常量指针”:您不能更改指针p本身,也不能通过p更改Fred对象。

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