我的同事是0 2上的问题,他一直激励着(1,2),所以我想我应该给他一个机会,迎头赶上.
我们最近的分歧是关于将"const"放在声明上的样式问题.
他认为它应该在类型前面,或者在指针之后.原因在于,这是其他人通常所做的事情,其他风格可能会让人感到困惑.因此,指向常量int的指针和指向int的常量指针将分别为:
const int *i;
int * const i;
Run Code Online (Sandbox Code Playgroud)
但是,无论如何我很困惑.我需要的是一致的,易于理解的规则,我可以做的"常量"意义上的唯一方法是,它去后,它被修改的事情.有一个例外允许它在最终类型前面,但这是一个例外,所以如果我不使用它,它会更容易.
因此,指向常量int的指针和指向int的常量指针将分别为:
int const * i;
int * const i;
Run Code Online (Sandbox Code Playgroud)
作为一个额外的好处,以这种方式做事使得更深层次的间接更容易理解.例如,指向int的常量指针的指针显然是:
int * const * i;
Run Code Online (Sandbox Code Playgroud)
我的论点是,如果有人只是按照自己的方式学习,他们就可以轻松搞清楚上面的内容.
这里的最终问题是他认为将int放在int之后是如此难以言喻的丑陋,对可读性有害,以至于它应该在样式指南中被禁止.当然,我认为如果指南应该建议按照我的方式做,但无论哪种方式,我们都不应该禁止一种方法.
编辑: 我已经得到了很多好的答案,但没有一个真正直接解决我的最后一段("最终问题").很多人都争论一致性,但在这种情况下是如此理想,禁止其他方式这样做是一个好主意,而不是仅仅劝阻它?
rlb*_*ond 51
最重要的是一致性.如果没有任何编码指南,那么选择一个并坚持下去.但是,如果您的团队已经拥有事实上的标准,请不要更改它!
也就是说,我认为到目前为止更常见的是
const int* i;
int* const j;
Run Code Online (Sandbox Code Playgroud)
因为大多数人写的
const int n;
Run Code Online (Sandbox Code Playgroud)
代替
int const n;
Run Code Online (Sandbox Code Playgroud)
旁注 - 读取指针的简单方法const是从右侧开始读取声明.
const int* i; // pointer to an int that is const
int* const j; // constant pointer to a (non-const) int
int const* aLessPopularWay; // pointer to a const int
Run Code Online (Sandbox Code Playgroud)
Ric*_*den 13
有一类示例将const放在类型的右侧也有助于避免混淆.
如果你在typedef中有一个指针类型,那么就不可能改变to类型的常量:
typedef int * PINT;
const PINT pi;
Run Code Online (Sandbox Code Playgroud)
'pi'仍然具有'int*const'类型,无论你在哪里写'const',这都是一样的.
ova*_*nes 11
我希望B. Stroustrup的风格和技术常见问题解答能给你一个明确的答案.
Bjarne Stroustrup的C++风格和技巧常见问题解答
我个人更喜欢:
int const* pi;
int* const pi;
Run Code Online (Sandbox Code Playgroud)
因为const标识了旨在成为const的左标记.
当你像这样使用smth时,你肯定保持相同的一致性:
int const* const pi;
Run Code Online (Sandbox Code Playgroud)
而不是写不一致:
const int* const pi;
Run Code Online (Sandbox Code Playgroud)
如果你有指针指针等会发生什么:
int const* const* const pi;
Run Code Online (Sandbox Code Playgroud)
代替:
const int* const* const pi;
Run Code Online (Sandbox Code Playgroud)
我参加了Bjarne Stroustrup发表演讲的会议,他使用的是像const int*i这样的东西.有人问他为什么这种风格和他回应(释义):"当事情不变时,人们喜欢先看到const".
人们通常使用,const int* blah因为它读得很好.我不会低估它的用处.
我发现这种int* const blah变化非常罕见,因此向后制作更常见的定义并不常见.总的来说,我并不喜欢在一般情况下甚至略微模糊代码的任何东西,尽管它可能在特殊情况下提供一些名义上的好处.
另请参见"if(1 == a)".有些人真的很喜欢编写不懂英文的代码.我不是那些人中的一个.
但实际上,const背后的规则很简单.向左看,然后向右看.如此简单,我不认为它在风格指南中值得关注.
如果只是它们的变量和指针可能const与否,那么它可能并不重要.但考虑一下:
class MyClass
{
public:
int foo() const;
};
Run Code Online (Sandbox Code Playgroud)
没有办法const可以写在其他任何地方,但尾随它所指的功能.
样式指南越短,开发人员就越有可能遵循它.并且可能的最短规则,以及将给您一致性的唯一规则是:
该const关键字总是落后不管它是指.
所以,我在这里为你的同事说0:3.
关于你的"终极问题":对于风格指南的缘故,不要紧是否先导"鼓励"或"禁令"的事情它说出来反对.这是一个社会问题,一个政策.风格指南本身应尽可能简洁明快.长篇导游只会被所有人忽略(管理层除了要注意责怪的人),所以只需写下"做"或"不做",并说明你在其他地方违反指南的行为(例如在公司政策中)如何进行同行评审).
虽然const int和之间没有任何有意义的区别int const(并且我已经看过两种使用的样式),但是const int *和之间存在差异int * const.
在第一个中,您有一个指向const int的指针.您可以更改指针,但不能更改它指向的值.在第二个中,你有一个指向int的const指针.你不能改变指针(希望它根据你的喜好初始化),但是你可以改变指向int的值.
正确的比较是const int *和int const *,它们都是指向const int的指针.
请记住,*它并不一定像您所希望的那样有效.声明int x, y;将按预期工作,但int* x, y;声明一个指向int的指针,一个int.
| 归档时间: |
|
| 查看次数: |
7939 次 |
| 最近记录: |