文件夹名一律小写,单词之间用下划线连接。
文件名一律小写,单词之间用下划线连接。
源文件名以.cpp结尾,头文件名以.h结尾,接口头文件名以_interface.h结尾。
头文件#define保护的格式:
#define 工程名_文件夹名1_子文件夹名2_头文件名_H_,全部大写,单词之间用下划线连接。
头文件,特别是接口头文件中,不是必须用#include包含的头文件,可以用前置声明代替,如class xx;,只有做可以减少编译依赖。
源文件foo.cpp中的#indelue顺序:
1 foo2.h
2 C 系统文件
3 C++ 系统文件
4 其他库的.h文件
5 本项目内.h文件
其中每个部分按ASCII码值顺序排列。
类的访问控制区段的声明顺序依次为:public,protected,private。如果某区段没内容,可以不声明。
每个区段内的声明通常按以下顺序:
typedefs和枚举
常量
构造函数
析构函数
成员函数,含静态成员函数
数据成员,含静态数据成员
基本数据类型建议使用int8_t, int32_t, int32_t, int64_t, float, double,不建议使用char, short, int, long等。
无符号数在与0比较时很容易除错,建议不要使用uint32_t等无符号整型(除非你是在表示一个位组而不是一个数值,或是你需要定义二进制补码溢出),尤其是不要为了指出数值永不会为负,而使用无符号类型。
namespace名全小写,单词之间用下划线连接。不建议用using namespace std;提前声明,建议用namespace的全路径,如std::string。
类型名的每个单词首字母均大写,单词之间不包含下划线,即驼峰法,如:MyExcitingClass、MyExcitingEnum。所有类型命名,包括类、结构体、类型定义 (typedef)、枚举,均使用该命名规则。接口名以Interface为后缀。
变量名一律小写,单词之间用下划线连接,如:
my_exciting_local_variable
类的成员变量以下划线结尾,如:
my_exciting_member_variable_
将类的所有数据成员声明为private。
结构体的数据成员不用像类的成员变量那样以下划线结尾:
struct UrlTableProperties {
string name;
int num_entries;
}
全局变量用g_作为前缀。
所有编译时常量,无论是局部的、全局的、还是类中的,和其他变量稍微区别一下,以k后接大写字母开头的单词,如:
const int kDaysInAWeek = 7;
单独的枚举值应该优先采用常量的命名方式,但宏方式的命名也可以接受,如:
enum UrlTableErrors {
kOK = 0,
kErrorOutOfMemory,
kErrorMalformedInput,
};
enum AlternateUrlTableErrors {
OK = 0,
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
};
永远不要用省略字母的缩写:
int error_count; // Good.
int error_cnt; // Bad.
常规函数:
函数名的每个单词首字母大写,没有下划线,如:
AddTableEntry()
DeleteUrl()
取值和设值函数:
取值和设值函数要与存取的变量名匹配,如int num_entries_ 是该类的实例变量,则相应的存取函数为:
class MyClass {
public:
...
int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) { num_entries_ = num_entries; }
private:
int num_entries_;
};
一般在头文件中把存取函数定义成内联函数。
函数参数顺序从左到右为:输入参数,然后是输出参数。
不允许使用缺省函数参数。
不在构造函数中做太多逻辑相关的初始化,建议提供Initialize和Finalize函数做初始化和清理相关的工作。
建议为所有类提供一个无参的构造函数和析构函数,以覆盖编译器的默认行为。
为避免隐式转换,应该将单参数构造函数声明为explicit的。
在声明的变量或参数前加上关键字const用于指明变量值不可被篡改(如 const int foo )。
将const放在前面才更易读,因为在自然语言中形容词(const)是在名词 (int)之前,如const int* foo;。
为类中的函数加上const限定符表明该函数不会修改类成员变量的状态(如 class Foo { int Bar(char c) const; };)。
宏名一律大写,单词之间用下划线连接。不建议使用宏。
不要使用 C 风格类型转换,而应该使用 C++ 风格。
用static_cast替代 C 风格的值转换,,或某个类指针需要明确的向上转换为父类指针时。
用const_cast去掉const限定符。
用reinterpret_cast指针类型和整型或其它指针之间进行不安全的相互转换,仅在你对所做一切了然于心时使用。
dynamic_cast在测试代码以外不要使用。除了测试代码,如果你需要在运行时确定类型信息,说明有设计缺陷。
文件名一律小写,单词之间用下划线连接。
源文件名以.cpp结尾,头文件名以.h结尾,接口头文件名以_interface.h结尾。
头文件#define保护的格式:
#define 工程名_文件夹名1_子文件夹名2_头文件名_H_,全部大写,单词之间用下划线连接。
头文件,特别是接口头文件中,不是必须用#include包含的头文件,可以用前置声明代替,如class xx;,只有做可以减少编译依赖。
源文件foo.cpp中的#indelue顺序:
1 foo2.h
2 C 系统文件
3 C++ 系统文件
4 其他库的.h文件
5 本项目内.h文件
其中每个部分按ASCII码值顺序排列。
类的访问控制区段的声明顺序依次为:public,protected,private。如果某区段没内容,可以不声明。
每个区段内的声明通常按以下顺序:
typedefs和枚举
常量
构造函数
析构函数
成员函数,含静态成员函数
数据成员,含静态数据成员
基本数据类型建议使用int8_t, int32_t, int32_t, int64_t, float, double,不建议使用char, short, int, long等。
无符号数在与0比较时很容易除错,建议不要使用uint32_t等无符号整型(除非你是在表示一个位组而不是一个数值,或是你需要定义二进制补码溢出),尤其是不要为了指出数值永不会为负,而使用无符号类型。
namespace名全小写,单词之间用下划线连接。不建议用using namespace std;提前声明,建议用namespace的全路径,如std::string。
类型名的每个单词首字母均大写,单词之间不包含下划线,即驼峰法,如:MyExcitingClass、MyExcitingEnum。所有类型命名,包括类、结构体、类型定义 (typedef)、枚举,均使用该命名规则。接口名以Interface为后缀。
变量名一律小写,单词之间用下划线连接,如:
my_exciting_local_variable
类的成员变量以下划线结尾,如:
my_exciting_member_variable_
将类的所有数据成员声明为private。
结构体的数据成员不用像类的成员变量那样以下划线结尾:
struct UrlTableProperties {
string name;
int num_entries;
}
全局变量用g_作为前缀。
所有编译时常量,无论是局部的、全局的、还是类中的,和其他变量稍微区别一下,以k后接大写字母开头的单词,如:
const int kDaysInAWeek = 7;
单独的枚举值应该优先采用常量的命名方式,但宏方式的命名也可以接受,如:
enum UrlTableErrors {
kOK = 0,
kErrorOutOfMemory,
kErrorMalformedInput,
};
enum AlternateUrlTableErrors {
OK = 0,
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
};
永远不要用省略字母的缩写:
int error_count; // Good.
int error_cnt; // Bad.
常规函数:
函数名的每个单词首字母大写,没有下划线,如:
AddTableEntry()
DeleteUrl()
取值和设值函数:
取值和设值函数要与存取的变量名匹配,如int num_entries_ 是该类的实例变量,则相应的存取函数为:
class MyClass {
public:
...
int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) { num_entries_ = num_entries; }
private:
int num_entries_;
};
一般在头文件中把存取函数定义成内联函数。
函数参数顺序从左到右为:输入参数,然后是输出参数。
不允许使用缺省函数参数。
不在构造函数中做太多逻辑相关的初始化,建议提供Initialize和Finalize函数做初始化和清理相关的工作。
建议为所有类提供一个无参的构造函数和析构函数,以覆盖编译器的默认行为。
为避免隐式转换,应该将单参数构造函数声明为explicit的。
在声明的变量或参数前加上关键字const用于指明变量值不可被篡改(如 const int foo )。
将const放在前面才更易读,因为在自然语言中形容词(const)是在名词 (int)之前,如const int* foo;。
为类中的函数加上const限定符表明该函数不会修改类成员变量的状态(如 class Foo { int Bar(char c) const; };)。
宏名一律大写,单词之间用下划线连接。不建议使用宏。
不要使用 C 风格类型转换,而应该使用 C++ 风格。
用static_cast替代 C 风格的值转换,,或某个类指针需要明确的向上转换为父类指针时。
用const_cast去掉const限定符。
用reinterpret_cast指针类型和整型或其它指针之间进行不安全的相互转换,仅在你对所做一切了然于心时使用。
dynamic_cast在测试代码以外不要使用。除了测试代码,如果你需要在运行时确定类型信息,说明有设计缺陷。