1. 变量声明和初始化
- 同一行不可声明多个变量;
- 局部变量声明和初始化置于一块;一定要初始化,防止内存泄漏等问题;
2. 枚举
-
尽量使用枚举,而不是静态、宏定义;原因:
#define宏定义没有类型检查和安全检查,所以会导致边际效应,出现不可预知的错误;在预处理阶段对所定义的常量进行替换展开 const在编译阶段进行类型检查和安全检查;在编译运行阶段 enum在编译阶段进行类型检查,但是只能进行整形的定义;程序运行时起作用
-
默认要提供一个0值枚举量;None = 0
3. 空格
- 变量声明和代码间有一行空格;
- 运算符等符号两侧空一格;
- 逗号右侧空一格;
- while、if等关键字与括号之间空一格;
- 大括号{}与相关代码置于下一行
4. 注释
-
应该使用 // 注释方式,多行注释也尽量使用;
-
将注释缩进与描述的代码同一级;
-
英文注释时,首字母大写的句子
-
内联代码(即类内的)注释:需在之前放置一个空行;
-
注释为结构体,类成员变量时,可以放在代码后面,同一行;
-
头文件注释:
/**********Header File************\ 功能描述 \************************************/
-
类注释
// 类名 // 类描述
5. 头文件
-
避免同一个头文件被包含(include)多次;尽量使用#ifndef控制唯一性
使用#ifndef / #endif或#pragmaonce ifndef:内容完全相同的文件(指同一个) pragmaonce: 物理上的同一个,而不是内容
-
头文件包含顺序
cpp自己的h c系统文件 c++系统文件 其他库h 本项目的h
6. 作用域·
- 禁止使用 using namespace
- 如果一个类只有静态成员函数,他应该用名字空间来代替。如果有全局函数,他应该放到名字空间里
7. 命名规范
类 各首字母大写,名词 calss ShowNumber()
枚举 各首字母大写
函数方法 各首字母大写
结构体 全大写,以_分隔单词
宏、常量 全大写,以_分隔单词
参数变量 驼峰命名
-
匈牙利命名法
布尔值 f- HANDLE h- WORD dw- char、TCHAR ch- PWSTR psz char[] sz- 指针 p- 数量 c- 类成员变量 m_ 类静态变量 s_ 全局变量 g_
8. 指针
- 声明指针时初始化,释放时赋予NULL;
- 待补充填写
9. 常量
-
全大写,以_分隔
-
一定使用const
宏定义#define不检查类型,而const会强制类型检查;
-
应该在传入和返回的参数添加const,表明参数不改变的意图
10. 类型转换
1.强制类型转换 static_cast
隐式转换:比如int与float、double与char、enum与int之间的转换等
double a = 1.999;
int b = static_cast<double>(a); //相当于a = b ;
2.处理无关类型转换 reinterpret_cast
允许将任何指针转换为任何其他指针类型
int *pi;
char *pc = reinterpret_cast<char*>(pi);
//他并没有进行二进制的转换,pc指向的真实对象其实还是int
!!不能对DWORD和指针进行相互转换
11. 字符串
- 宽字符类型,使用wchar_t,PWSTR,PCWSTR;不要使用TCHAR版本的类型
- 创建Unicode字符串时,不要使用TEXT宏,应该使用L”字符串值“;
12. 数组
- 数组初始化,使用{} 将数组置于零,比{0} 性能高;
13. 函数
- 函数的参数顺序为: 输入参数在先, 后跟输出参数
- 所有按引用传递的参数必须加上 const
- 类
- 一定要写构造函数和析构函数;良好的习惯;
- 禁止声明public 数据成员
- 在构造函数中使用初始化,而不是赋值操作;
A::A():
m_a(1)
m_b(2)
{
}
按照类声明的顺序初始化
- 析构函数,处理资源清理工作,如:delete释放资源等;