一、有关table和空格
(1)每一行开始处的缩进只能用Tab,不能用空格,输入内容之后统一用空格。
除了最开始的缩进控制用Tab,其他部分为了对齐,需要使用空格进行缩进。这样可以避免在不同的编辑器下显示不对齐的情况
(2)在代码行的结尾部分不能出现多余的空格
(3)不要在"::", "->", "."前后加空格
(4)不要在",", ";"之前加空格。
二、类型定义中大括号
(1)类,结构,枚举,联合:大括号另起一行
联合体union:联合体和结构体最大的区别在于,联合体的内存地址是统一的,联合体所有的成员占用同一块也就是成员变量中最大的一块内存地址。
最大成员大小 不是 最大对齐数 的 整数倍 的时候,就要对齐到最大对齐数的整数倍。对于 数组来说,当我们计算 该数组所占内存空间大小的时候,不要拆分,把他看成一个整体,计算他 整个数组所占内存空间的 大小即可。
下方为其占用内存的详细计算方式,假设int占用四个字节,5个为20个字节,longlong占8个字节
typedef union{
int b[5]; //20
long long c; //8
}DATA;
实际上这个union将占用24个字节,计算方式:最大的成员占用数20加上必须是最大成员类型的最小倍数也就是8的倍数24。
枚举:默认数值从0开始,向下依次加一。也可重新定义初值为任意正整数,没有新的赋值的话向下依次加一。无论是枚举类型的大小, 还是枚举变量的大小,在内存中所占内存空间都是4byte。
//声明枚举类型:
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri, //大括号里面放的是枚举变量的可能取值,并且是常量,即:枚举常量。
//枚举中的成员变量一般都采用全大写,这里不太标准。
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色,三颜色
{
RED, //默认值为0
GREEN, //默认值为1
BLUE //默认值为2
};
// enum:枚举关键字,color:枚举名字,enum color:枚举类型
三、函数
(1)函数体的{需要新起一行,在{之前不能有缩进。
(2)除了特别情况,函数体内不能出现两个空行。
(3)除了特别情况,函数体内不能宏定义指令。
(4)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
(5)在头文件定义的inline函数,函数之间可以不用空行,推荐用一个空行。
四、代码块
(1)"if"、"for"、"while"、"do"、"try"、"catch"等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加"{ }"。这样可以防止书写和修改代码时出现失误。
(2)"if"、"for"、"while"、"do"、"try"、"catch"的括号和表达式,括号可紧挨关键字,这样强调的是表达式。
五、 else
(1)if语句如果有else语句,用 } else { 编写为一行,不推荐用3行代码的方式
六、代码行
(1)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
(2)多行变量定义,为了追求代码排版美观,可将变量竖向对齐。
(3)代码行最大长度宜控制在一定个字符以内,能在当前屏幕内全部可见为宜。
七、switch语句
(1)case关键字应和switch对齐。
(2)case子语句如果有变量,应用{}包含起来。
(3)如果有并列的类似的简单case语句,可考虑将case代码块写为一行代码。
(4)简单的case之间可不用空行,复杂的case之间应考虑用空行分割开。
(5)case子语句的大括号另起一行,不要和case写到一行。
(6)为所有switch语句提供default分支。
(7)若某个case不需要break一定要加注释声明。
八、循环
(1)空循环可用for( ; ; )或者while(1)或者while(true)
九、类
(1)多继承中,类继承应采用每个基类占据一行的方式,先后顺序大概是这样
#include <iostream>
using namespace std;
//基类
class BaseA{
public:
BaseA(int a, int b);
~BaseA();
protected:
int m_a;
int m_b;
};
BaseA::BaseA(int a, int b): m_a(a), m_b(b){
cout<<"BaseA constructor"<<endl;
}
BaseA::~BaseA(){
cout<<"BaseA destructor"<<endl;
}
//基类
class BaseB{
public:
BaseB(int c, int d);
~BaseB();
protected:
int m_c;
int m_d;
};
BaseB::BaseB(int c, int d): m_c(c), m_d(d){
cout<<"BaseB constructor"<<endl;
}
BaseB::~BaseB(){
cout<<"BaseB destructor"<<endl;
}
//派生类
class Derived: public BaseA, public BaseB{
public:
Derived(int a, int b, int c, int d, int e);
~Derived();
public:
void show();
private:
int m_e;
};
Derived::Derived(int a, int b, int c, int d, int e): BaseA(a, b), BaseB(c, d), m_e(e){
cout<<"Derived constructor"<<endl;
}
Derived::~Derived(){
cout<<"Derived destructor"<<endl;
}
void Derived::show(){
cout<<m_a<<", "<<m_b<<", "<<m_c<<", "<<m_d<<", "<<m_e<<endl;
}
int main(){
Derived obj(1, 2, 3, 4, 5);
obj.show();
return 0;
}
运行结果:
BaseA constructor
BaseB constructor
Derived constructor
1, 2, 3, 4, 5
Derived destructor
BaseB destructor
BaseA destructor
(2)单继承可将基类放在类定义的同一行。如果用多行,则应用Tab缩进
(3)多继承在基类比较多的情况下,应将基类分行,并采用Tab缩进对齐
(4)重载基类虚函数,应在该组虚函数前写注释// implement XXX
(5)友元声明放到类的末尾
十、宏
(1)不要用分号结束宏定义
(2)函数宏的每个参数都要括起来
(3)不带参数的宏函数也要定义成函数形式
十一、goto
(1)尽量不要用goto