我无法找到在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
之前或之后出现,这是它修改的内容。
const
正在修改*
(指针)而不是int
?const
应用于哪个内容?*
的相同规则?答案 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 ++引用不遵循此规则)。