理解“const”在声明中的位置

时间:2011-07-06 02:04:48

标签: c++ c syntax constants

我无法找到在C和C ++语言中使用const的方式的直观模式。以下是一些例子:

const int a;    //Const integer
int const a;    //Const integer
const int * a;  //Pointer to constant integer
int * const a;  //Const pointer to an integer
int const * a const;    //Const pointer to a const integer

在第1行和第2行中,似乎const可以在int之前或之后出现,这是它修改的内容。

  1. 那么,在第4行中,编译器如何确定const正在修改*(指针)而不是int
  2. 编译器遵循什么规则来决定const应用于哪个内容?
  3. 是否遵循*的相同规则?

5 个答案:

答案 0 :(得分:7)

假设您始终将const放置到该类型的右侧,您可以将变量声明从右到左读取为句子:

int const x;        // x is a constant int
int *const x;       // x is a constant pointer to an int
int const *x;       // x is a pointer to a constant int
int const *const x; // x is a constant pointer to a constant int

如果您将const放在某个类型的左侧,但需要更多精力,这仍然有效。请注意,这与指针指针(以及更高阶的构造)一样有效:

int *const *const x; // x is a constant pointer to a constant pointer to an int

答案 1 :(得分:5)

编译器通常从右到左读取类型,所以:

T const& const

读作:

 const (a constant)
 & (to a reference)
 const (to a constant)
 T (of type T)

所以,基本上关键字“const”会修改它之前的所有内容。但是,在“const”首先出现的情况下有一个例外,在这种情况下,它会直接修改项目的右边:

const T& const

以上内容读作:

const (a constant)
& (to a reference)
const T (to a constant of type T)

以上相当于T const&常量。

虽然编译器就是这样做的,但我真的只是建议记住“T”,“const T”,“const T&”,“const T *”,“const T& const”,“const T” * const“,”T& const“和”T * const“。您很少会遇到“const”的任何其他变体,当您这样做时,使用typedef可能是个好主意。

答案 2 :(得分:2)

对于指针,这是我从Scott Meyers的一本书(我认为)中选取的。通过*绘制一条垂直线,然后在线的同一侧绘制一条垂线,因为const关键字是const的东西。

澄清:

int * const a表示a是const,而不是int。而“a”是指向(非const)int的指针。

答案 3 :(得分:0)

嗯,首先,这个问题更多的是个人偏好。对于休闲程序员来说,它更像是一种个人风格。但是,对于那些与企业打交道的人来说,可以采用某种编码约定,让程序员遵循这些约定,以便每个人都能提供一致的编码风格。

(1)对于const int * const a;,这意味着您无法更改指针所指向的内容,但您可以修改该内存位置。

(2)'const'由你决定,作为程序员,你是否想要指针所指向的地址,是否为常数,或者你是否希望指针不修改它所指向的指针。

(3)是的,*的规则与const int * const a;

的情况相同

作为补充说明,您的最后一行无效C89。

希望它有所帮助。干杯!

答案 4 :(得分:0)

理解这些的关键是要意识到*绑定到a,而不是类型。所以你应该把它们看作:

const int a;    // a has type const int
int const a;    // a has type int const
const int * a;  // *a has type const int
int * const a;  // *(const a) has type int, which means *a has type int and a is const
int const * a const;    // *(const a) has type int const, which means *a has type const int and a is const.

(请注意,C ++引用不遵循此规则)。