您的位置:首页 > 编程语言

[编程规范]二、声明、定义、初始化

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。

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_;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: