我经常看到这样的东西:
class SomeClass {
public:
void someMethod();
private:
int someMember;
};
这对我来说似乎完全不自然(同样适用于case
- 使用switch
时的语句。我期待这样的事情,当我开始使用C ++时(从那时起已经很长时间了,但我仍然想知道):
class SomeClass {
public:
void someMethod();
private:
int someMember;
};
是否有资金理由打破(否则)一致的缩进规则?
答案 0 :(得分:29)
增加缩进通常反映了对新嵌套作用域的输入,而访问说明符和switch case
语句都不会改变作用域(通常标签也是如此)。访问说明符可以是可选的,因为您可以开始实现类或结构,并且所有成员只需要隐含访问(即分别是私有和公共访问),但随后代码会发展,您需要为非隐含访问者添加说明符 - 访问成员:是否真的值得突然改变所有成员的缩进?同样,没有嵌套的范围,所以我认为这会产生误导。
如果你在固定宽度的终端上工作并相应地包裹你的线条,那么重新定位是一种痛苦。但是,让访问说明符从成员中脱颖而出是有用的,这意味着将它们放回到某处 - 与class关键字一致或在那里分开。
就个人而言,我这样做:
class X
{
public:
int member_function()
{
switch (expression)
{
case X:
return 6;
default:
{
int n = get_value() / 6;
return n * n;
}
}
}
private:
int member_variable_;
};
为什么我不进一步缩进每个case
的代码?我无法宣称我做的事情特别合乎逻辑,但因素包括:
switch
/ case
缩进,因为在视觉上传达切换范围对于快速理解代码非常重要{
和}
放在现有的case
代码周围 - 更像是评论“嘿,我需要一个范围” - 而不是感到有吸引力的缩进一切都进一步,即使对我来说也没有多大意义但感觉有点 - 我喜欢为每个case
排队的代码case
语句中引入新变量而不引入范围,则某些编译器会发出警告,即使以后没有使用该变量的情况也可能未初始化switch
内 - 因此显然是一个函数 - 意味着剩下的列很有价值。 class
/ struct
:
class
关键字,但它确实有助于使它们在视觉上与成员不同(如果类/结构多于几行,我还预先添加一个空行) /
或private
说明符protected
结构成员缩进
总之:很多小因素都会影响人们的缩进偏好,如果你想成为企业环境中的C ++程序员 - 特别是承包商 - 你只需要顺其自然,就能改变自己的想法。风格有时也是(例如我现在卡在了camelCaseLand中,公共成员变量以大写字母开头 - 呀!)。不要冒汗 - 这不值得。
答案 1 :(得分:13)
访问说明符实际上只是标签(如goto
所使用的那些)。人们通常不会缩进标签,或者在周围代码中将其标记为一级。所以我想说这根本不矛盾。
标准也将此样式用于访问说明符。第10章第2段的例子:
class Base {
public:
int a, b, c;
};
答案 2 :(得分:8)
想象一下这样一个类定义:
class SomeClass {
void ImplicitlyPrivateMethod();
public:
void someMethod();
private:
int someMember;
};
根据你提出的缩进风格,人们需要将其改为
class SomeClass {
void ImplicitlyPrivateMethod();
public:
void someMethod();
private:
int someMember;
};
(对许多人来说看起来不太好,特别是如果“隐含”部分足够长的话)。
我个人更喜欢这种说明符的半缩进:
class SomeClass {
void ImplicitlyPrivateMethod();
public:
void someMethod();
private:
int someMember;
};
但这是个人品味的问题。
答案 3 :(得分:7)
与许多其他事情一样,重要的是不要将规则误认为是有目的的。缩进的目的是通过提供关于属于何处的额外视觉提示,使代码更清晰,更易于阅读。现在,在您提及的特定情况下,与namespace
一起,在许多情况下,额外的缩进对可读性没有帮助。交换机中的case
可以理解为if-else
s,您不会在其中添加额外的缩进。这些案例是块分隔符,与花括号类似。
switch ( var ) {
case 1: // if ( var == 1 ) {
code;
case 2: // } else if ( var == 2 ) {
code;
}
在类级别,可以将访问修饰符视为与类所支持的级别相同的块分隔符。添加额外级别的缩进不会使代码更清晰:
class test {
public:
void foo();
private:
int member;
};
命名空间也是如此,有些人避免缩进整个命名空间级别。在所有三种情况下,添加额外缩进没有明显的优势,如果您遵守短代码行(80/100字符)和足够大的缩进级别(8或甚至4个字符),那么不缩进可能有一个优势
就我个人而言,我永远不会缩进case
或访问者修饰符,在namespace
s的情况下,它取决于......涵盖整个源文件的namespace
很可能不会缩进,而只占用源文件一部分的命名空间将缩进 - 理由是在前一种情况下它不会增加实际值,而在第二种情况下它会增加。
答案 4 :(得分:6)
两个可能的原因:
这就是Bjarne Stroustrup在他的书中缩进的方式
大多数文字编辑器会自动缩进
答案 5 :(得分:3)
这完全是关于分支的范围和分组。如果这些不受影响,则不要添加缩进级别。
举例如下:
if( test == 1 ) {
action1( );
} else if( test == 2 ) {
action2( );
} else {
action3( );
}
记下语句块的级别。现在重写它作为带有缩进情况的case语句:
switch( test ) {
case 1:
action1( );
break;
case 2:
action2( );
break;
default:
action3( );
break;
}
这在功能上完全相同,但缩进与我的动作不匹配。我认为正是这种不一致最终使我改变了删除额外的虚假缩进。 (即使我不介意别人提出的半缩进,请注意。)
答案 6 :(得分:1)
每个类的访问修饰符行很少,并且大多数编辑器的颜色修饰符与其他所有颜色不同。他们自己脱颖而出,为什么要添加不必要的标签呢?
答案 7 :(得分:1)
由于public
和private
是不引入新范围的标签,因此我不想给它们任何特殊的缩进,因此:
class foo {
public:
void something();
void something_else();
private:
int top_secret;
};
这样,一致的缩进规则是“缩进等于范围”。
答案 8 :(得分:0)
大多数编辑器会自动缩进它们,对我来说,我将它们保留为小类或小文件或短切换语句,但对于长文件或带有许多长切换语句的长文件,我使用更多缩进以便于阅读
我有时这样做,我觉得它是旧式
Class CClass
{
CClass();
~CClass();
Public:
int a;
Private:
int b;
};
CClass::CClass
{
TODO code;
}
当文件包含超过20或50个函数时,这有时会更容易,因此您可以轻松找到每个函数的开头
答案 9 :(得分:0)
如前所述(虽然主张非缩进访问修饰符),访问修饰符形成逻辑块。虽然它们与类括号处于同一水平,但它们很特殊。
因此,缩进可以清楚地显示每个块的开始和结束位置。
我个人认为它使代码更清晰。其他人不同意。
这是一个相当主观的问题。