[编程规范]二、声明、定义、初始化
2016-07-19 22:02
281 查看
1.禁止使用memcpy memset 初始化非POD对象
POD(Plain Old Data)主要包括 int,char,float,double,enum,void,指针等原始类型和其集合。
非POD类型,可能含有虚函数,导致内存布局不确定,使用memset可能会带来问题。比如示例
memset(this, 0, sizeof(this));
在这个代码中,将虚函数表指针vptr置为空,调用空指针,程序会异常退出。
2.变量使用时才声明并初始化
避免了使用变量时未赋初值的错误。
节省资源和方便代码阅读。因为一开始就声明并且初始化一堆默认值,是对资源的浪费,程序及有可能提前退出,而且不方便阅读,看个代码总是要拉到函数开始处去看变量初始值。
3.避免构造函数中过于复杂的初始化
一般建议仅仅在构造函数中做值的初始化,复杂的构造放在init函数中进行,以下几种情况尤其推荐使用init函数
需要提供初始化信息
初始化可能抛出异常
初始化可能会失败,引起不确定状态
依赖this指针,this指针只有在构造函数结束后才可使用
需要用到虚函数。注意构造和析构函数中使用虚函数会引起未定义行为,禁止使用。
4.初始化列表要严格按照成员声明的顺序进行编写
因为编译器会按照数据成员在类中的声明顺序进行初始化,而不是初始化列表的顺序,主要是为了避免理解混淆和顺序依赖的BUG。
POD(Plain Old Data)主要包括 int,char,float,double,enum,void,指针等原始类型和其集合。
非POD类型,可能含有虚函数,导致内存布局不确定,使用memset可能会带来问题。比如示例
memset(this, 0, sizeof(this));
在这个代码中,将虚函数表指针vptr置为空,调用空指针,程序会异常退出。
2.变量使用时才声明并初始化
避免了使用变量时未赋初值的错误。
节省资源和方便代码阅读。因为一开始就声明并且初始化一堆默认值,是对资源的浪费,程序及有可能提前退出,而且不方便阅读,看个代码总是要拉到函数开始处去看变量初始值。
3.避免构造函数中过于复杂的初始化
一般建议仅仅在构造函数中做值的初始化,复杂的构造放在init函数中进行,以下几种情况尤其推荐使用init函数
需要提供初始化信息
初始化可能抛出异常
初始化可能会失败,引起不确定状态
依赖this指针,this指针只有在构造函数结束后才可使用
需要用到虚函数。注意构造和析构函数中使用虚函数会引起未定义行为,禁止使用。
4.初始化列表要严格按照成员声明的顺序进行编写
因为编译器会按照数据成员在类中的声明顺序进行初始化,而不是初始化列表的顺序,主要是为了避免理解混淆和顺序依赖的BUG。
class Employee { public: Employee(const char* firstName, const char* lastName) <span style="white-space:pre"> </span>:firstName_(firstName), lastName_(lastName), email_(firstName_ + "." + lastName_ + "@huawei.com") {}; private: string email_, firstName_, lastName_; };
相关文章推荐
- C# 正则表达式的使用
- Qt 文件搜索(写入文本文件)
- Python学习进程(7)字符串
- 重学编程-编程入门指南 v1.4
- 以写代学:python shutil模块
- Django中Admin管理与权限管理(一)————模型创建
- java xml与json 相互转换
- 极客班C++(上)第一周课程笔记
- laravel 怎么部署到万网的虚拟主机上?
- WebDev.WebServer40 调试vs代码
- bwlabel.cpp
- CodeWars---Python第二题
- 修改wampserver的www目录及phpMyadmin问题解决
- Hadoop 1.1.2 eclipse plugin 编译 win7 集成
- struts2前端页面读取Clob BLOB
- springboot下配置junit测试环境
- 用Java实现九九乘法表
- Python爬虫----网页解析器和BeautifulSoup第三方模块
- Java-Vector
- SpringMVC学习(二)