Effective C++ 规范

以const、enum、inline替换#define

1
2
3
4
5
6
// #define NUM 10
const unsigned int NUM = 10;
enum {
FIRST = 1;
SECOND = 2;
};

手工初始化对象

1
2
3
unsigned int i = 0;
string str = "";
int *p = nullptr;

使用delete和virtual

1
2
3
4
5
6
7
8
9
class Name {
public:
Name() = default;
Name(std::string name_);
virtual ~Name() = default;
private:
Name(const Name&) = delete;
Name& operator=(const Name&) = delete;
};

绝不在构造和析构函数中直接或者间接的调用virtual函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 错误做法
class Name {
public:
Name() = default;
Name(std::string name_) {
SetName();
}
virtual ~Name() = default;
virtual SetName() const = 0;
private:
Name(const Name&) = delete;
Name& operator=(const Name&) = delete;
};

// 正确做法
class Name {
public:
Name() = default;
Name(std::string name_) {
SetName();
}
virtual ~Name() = default;
SetName() const {

}
private:
Name(const Name&) = delete;
Name& operator=(const Name&) = delete;
};

class MyName : public Name {
public:
MyName() = default;
MyName(std::string name_) :
Name(name_) {
SetName();
}
virtual ~Name() = default;
SetName() const {

}
private:
MyName(const MyName&) = delete;
MyName& operator=(const MyName&) = delete;
};

对象拷贝函数需要复制所有的成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Name {
public:
Name() = default;
Name(std::string name_) {
SetName();
}
virtual ~Name() = default;
SetName() const {

}
private:
std::string name_;
int *age_;
Name(const Name& lhr) :
name_(lhr.name_){
age_ = new int; // point need have the own space
}
Name& operator=(const Name&) = delete;
};

记得对返回的对象指针的释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Name {
public:
Name() = default;
virtual ~Name() = default;
Name* CreateName() const {
return new Name;
}
private:
std::string name_;
int *age_;
Name(const Name& lhr) = delete;
Name& operator=(const Name&) = delete;
};

void ShowName() {
Name old_name;
Name* name = old_name.CreateName();
// ..........
delete name;
name = nullptr;
}

成对并相同使用New和Delete

1
2
3
4
5
6
7

std::string* str_ptr1 = new std::string;
std::string* str_ptr2 = new std::string[100];

delete str_ptr1;
delete [] str_ptr2;

使用智能指针指向对象

1
2
3

std::share_ptr<Name> name_ptr = new Name("YourName");