c ++编码规范之 c ++的用法
DESCRIPTION
C ++编码规范之 C ++的用法. C ++的用法. 类型的使用 函数 类的设计和声明 继承 内存分配和释放 初始化和清除 常量 重载. C ++的用法. 操作符 类型转换 友元 模板 表达式和控制流程 宏 异常处理. 类型的使用. 慎用无符号类型 用 typedef 简化程序中的复杂语法 用 enum 取代(一组相关的)常量 尽量用引用代替指针. 函数. 对内置类型参数一般传值 对非内置类型参数应传递引用或指针 若不得不使用参数不确定的函数,采用 提供的方法 若函数返回状态,尝试用枚举做返回类型 - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/1.jpg)
CC ++编码规范之++编码规范之CC ++的用法++的用法
![Page 2: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/2.jpg)
CC ++的用法++的用法
•类型的使用类型的使用•函数函数•类的设计和声明类的设计和声明•继承继承•内存分配和释放内存分配和释放•初始化和清除初始化和清除•常量常量•重载重载
![Page 3: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/3.jpg)
CC ++的用法++的用法
•操作符操作符•类型转换类型转换•友元友元•模板模板•表达式和控制流程表达式和控制流程•宏宏•异常处理异常处理
![Page 4: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/4.jpg)
类型的使用类型的使用
•慎用无符号类型慎用无符号类型•用用 typedeftypedef 简化程序中的复杂语法简化程序中的复杂语法•用用 enumenum 取代(一组相关的)常量取代(一组相关的)常量•尽量用引用代替指针尽量用引用代替指针
![Page 5: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/5.jpg)
函数函数
• 对内置类型参数一般传值对内置类型参数一般传值• 对非内置类型参数应传递引用或指针对非内置类型参数应传递引用或指针• 若不得不使用参数不确定的函数,采用若不得不使用参数不确定的函数,采用 <stdarg.h<stdarg.h
>> 提供的方法提供的方法• 若函数返回状态,尝试用枚举做返回类型若函数返回状态,尝试用枚举做返回类型• 函数尽量返回引用函数尽量返回引用• 若必须返回值,不要强行返回引用若必须返回值,不要强行返回引用• 禁止成员函数返回成员的引用或指针禁止成员函数返回成员的引用或指针• 重复使用的代码用函数代替重复使用的代码用函数代替
![Page 6: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/6.jpg)
类的设计和声明类的设计和声明
•保持类的不同接口在实现原则上的一致性保持类的不同接口在实现原则上的一致性•保持不同类接口在实现原则上的一致性保持不同类接口在实现原则上的一致性•显式禁止编译器自动生成不需要的函数显式禁止编译器自动生成不需要的函数•用嵌套类的方法减少全局命名空间类的数用嵌套类的方法减少全局命名空间类的数
量量•提高类内聚合度,降低类间的耦合度提高类内聚合度,降低类间的耦合度•不要在类定义时提供函数体不要在类定义时提供函数体
![Page 7: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/7.jpg)
继承继承
•继承接口和继承实现继承接口和继承实现(纯虚函数,一般虚函数,非虚函数)(纯虚函数,一般虚函数,非虚函数)
•显式提供继承和访问修饰,显式指出继承显式提供继承和访问修饰,显式指出继承的虚函数的虚函数
•基类析构函数函数首选是虚函数基类析构函数函数首选是虚函数• CC ++分支用法选择,基于值或基于对象类++分支用法选择,基于值或基于对象类
型型
![Page 8: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/8.jpg)
内存内存
•谁申请谁释放谁申请谁释放
•类消亡时保证指针成员所指堆释放类消亡时保证指针成员所指堆释放
•当所指内存被释放后,指针应有一个合理当所指内存被释放后,指针应有一个合理的值的值
•给字符串结束符申请空间给字符串结束符申请空间
![Page 9: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/9.jpg)
初始化和清除初始化和清除
•声明即初始化强于使用前才初始化声明即初始化强于使用前才初始化•确保构造函数初始化完全确保构造函数初始化完全•尽量使用初始化列表尽量使用初始化列表•构造函数未结束,对象就没有构造出来构造函数未结束,对象就没有构造出来•让赋值函数返回当前对象的引用(=的用让赋值函数返回当前对象的引用(=的用
法法
![Page 10: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/10.jpg)
常量和重载常量和重载
•类成员可转换成常量形式暴露出来类成员可转换成常量形式暴露出来•任何变量和成员函数,首选用任何变量和成员函数,首选用 constconst 修饰修饰
•避免重载指针和整型类型上避免重载指针和整型类型上
![Page 11: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/11.jpg)
操作符操作符
•遵守操作符原义遵守操作符原义•确保自定义操作符能与其他混用确保自定义操作符能与其他混用•操作符需要左值,定义为成员函数;否,操作符需要左值,定义为成员函数;否,
作为友元函数作为友元函数•后缀操作符 ++(后缀操作符 ++( intint )前缀++()前缀++( voivoi
dd ))
![Page 12: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/12.jpg)
类型转换类型转换
•尽量避免强制类型转换。若需,显式转换尽量避免强制类型转换。若需,显式转换•使用新型类型转换,并保证选择正确使用新型类型转换,并保证选择正确
const_cast,dynamic_cast,static_caconst_cast,dynamic_cast,static_castst
•自定义类最好提供显式转换函数自定义类最好提供显式转换函数asInt() asInt() 代替 代替 int()int()
•限制隐式类型转换的类型数限制隐式类型转换的类型数
![Page 13: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/13.jpg)
友元和模板友元和模板
•少用友元少用友元
•模板的限制条件要描述清楚模板的限制条件要描述清楚•模板中应传引用和指针,而非值模板中应传引用和指针,而非值
![Page 14: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/14.jpg)
表达式和控制流程表达式和控制流程
•尝试用范围比较代替精确比较尝试用范围比较代替精确比较
![Page 15: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/15.jpg)
宏宏
•彻底用常量代替(功能类似的)宏彻底用常量代替(功能类似的)宏
•彻底用彻底用 inlineinline 函数代替(功能类似)宏函数函数代替(功能类似)宏函数•用用 {}{} 把函数宏的函数括起来把函数宏的函数括起来
•彻底用彻底用 typedeftypedef 代替宏定义新类型代替宏定义新类型
•不要在公共头文件中定义宏不要在公共头文件中定义宏
![Page 16: C ++编码规范之 C ++的用法](https://reader036.vdocuments.pub/reader036/viewer/2022082401/56812a9f550346895d8e5ca6/html5/thumbnails/16.jpg)
异常处理异常处理
•确保代码在异常出现时正确处理确保代码在异常出现时正确处理•注意模板类型可能会破坏异常处理的一些注意模板类型可能会破坏异常处理的一些约定约定
•当心析构时发生异常当心析构时发生异常•捕捉异常时不用先基类后派生类捕捉异常时不用先基类后派生类•捕捉异常时用引用捕捉异常时用引用