版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38126105/article/details/84504535
11. 在operator=中处理自我赋值
该条款说的是,在operator函数中,应该先判断是否在进行自赋值,如果是自赋值,应该直接返回*this,而不是继续进行自我赋值
class Student
{
public:
Student(int age):m_age(age) {}
~Student() {}
private:
Student& operator=(const Student& rhs)
{
//条款11
if (this == &rhs)
{
return *this;
}
m_age = rhs.m_age;
return *this;
}
int m_age;
};
12. 复制对象时勿忘每一个成分
-
copying函数应该确保复制“对象内的所有成员变量”以及“所有基类成分”
-
不要尝试以某个copying函数实现另一个copying函数,而应该将共同的机能放进第三个函数中,并由copying函数共同调用。
class BoyStudent : public Student { public: BoyStudent(int name,string sex):Student(name),m_sex(sex){} BoyStudent& operator=(const BoyStudent& rhs) { if (this == &rhs) { return *this; } //重点,必须要复制所有的成分 Student::operator=(rhs); m_sex = rhs.m_sex; } private: string m_sex; };
13. 以对象管理资源
- 为了防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。必须lock_guard。
- 常备使用的有unique_ptr和shared_ptr
14. 在资源管理中心类中小心copy行为
常见的做法是抑制copy
15. 在资源管理类中提供对原始资源的访问
16. 成对使用new和delete时要采取相同的形式
17. 以独立语句将new创建出来的对象置入智能指针中
以独立的语句将newed对象置于智能指针内,如果不这样做,一旦有异常别抛出,有可能导致难以察觉的资源泄露,对于shared_ptr,推荐使用std::make_shared来进行赋值,对于unique_ptr,推荐使用std::unique_ptr来进行赋值。
18. 让接口容易被正确使用,不易被误用
- 阻止误用的办法包括建立新的类型。限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
19. 设计class犹如type
- 新type的对象应该如何被创建和销毁
- 对象的初始化和对象的赋值该有什么样的差别(拷贝构造函数和operator=)
- 新type的对象如果被以pass-by-value(以值传递),意味着什么?(拷贝构造函数会被调用)
- 什么是新type的“合法值”
- 新type的需要继承吗?(析构virtual)
- 新的type需要什么样的转换(构造函数的重载或者explict)
- 什么样的操作符对此新的type而言是合法的
- 什么样的标准函数应该被驳回(private函数)
- 新的type有多么一般化(模板类)
20. 宁以pass-by-reference-to-const替换pass-by-value
pass-by-reference-to-const说的是const引用或者const指针,pass-by-value说的普通的值传递。因为by-refernce传递的是地址,所以只有4个字节的copy,而by-value需要先创建一个对象,在然后赋值,所以会有不如以pass-by-reference-to-const来进行传递,加上const,表明运行期也无法修改该值,所以尽量采用该方法进行值传递。