const之前或const之后?

要开始你可能知道const可以用来使对象的数据或指针不可修改或两者兼而有之。

 const Object* obj; // can't change data Object* const obj; // can't change pointer const Object* const obj; // can't change data or pointer 

但是,您也可以使用以下语法:

 Object const *obj; // same as const Object* obj; 

似乎唯一重要的是你把const关键字放在星号的哪一边。 就我个人而言,我更喜欢把const放在types的左边来指定它的数据是不可修改的,因为我发现它从左到右的思维模式读得更好,但是哪个语法最先?

更重要的是,为什么有两种正确的方式来指定const数据,在什么情况下你会喜欢还是需要一个呢?

编辑:

所以这听起来像是一个随意的决定,编译器如何解释事物的标准早在我出生之前就已经起草了。 由于const被应用于关键字左侧的内容(默认情况下),我想他们认为添加“快捷方式”来应用关键字并以其他方式input限定符是没有害处的,至less在声明发生变化之前通过parsing一个*或…

这是C的情况,以及我假设?

“为什么有两种正确的方式来指定const数据,在什么情况下,如果有的话,你更喜欢还是需要一个?”

本质上,星号之前的指定符中const的位置并不重要的原因是C语法是由Kernighan和Ritchie定义的。

他们以这种方式定义语法的原因很可能是他们的C编译器从左到右分析input,并且完成每个标记的消耗。 使用*标记会将当前声明的状态更改为指针types。 遇到constconst表示const限定符应用于指针声明; 在*之前遇到它表示将限定符应用于指向的数据。

由于如果const限定符出现在types说明符之前或之后,语义的含义不会改变,所以可以接受。

在声明函数指针时会出现类似的情况,其中:

void * function1(void)声明一个返回void *的函数,
void (* function2)(void)声明一个返回void函数指针

同样需要注意的是,语言语法支持从左到右的parsing器。

规则是:

const适用于它剩下的东西。 如果左边没有什么东西,那么它就适用于它的事情。

我更喜欢使用const的const作为const,因为它是const定义的“原始”方式。

但我认为这是一个非常主观的观点。

我更喜欢第二种语法。 通过从右向左阅读types声明,它可以帮助我logging“常量”是什么:

 Object * const obj; // read right-to-left: const pointer to Object Object const * obj; // read right-to-left: pointer to const Object Object const * const obj; // read right-to-left: const pointer to const Object 

声明中关键字的顺序并不全是固定的。 “一个真正的秩序”有很多的select。 喜欢这个

 int long const long unsigned volatile i = 0; 

或者应该是

 volatile unsigned long long int const i = 0; 

??

第一条规则是使用本地编码标准所要求的格式。 之后:将const放在前面,当涉及到typedefs时,会导致混淆,例如:

 typedef int* IntPtr; const IntPtr p1; // same as int* const p1; 

如果你的编码标准允许typedef的指针,那么它确实应该坚持把const放在types之后。 在每种情况下,除了适用于这个types,const必须遵循它所适用的东西,所以连贯性也在后面支持const。 但是本地编码指导方针胜过所有这些; 差别通常不足以重新回到原来的代码。

有左或右的历史原因是可以接受的。 Stroustrup在1983年之前为C ++增加了const ,但是直到C89 / C90才将它添加到C中。

在C ++中,有一个很好的理由总是在右边使用const。 因为const成员函数必须这样声明,所以在每个地方都是一致的:

 int getInt() const;