Effictive C++条款整理计划(11-20)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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. 复制对象时勿忘每一个成分

  1. copying函数应该确保复制“对象内的所有成员变量”以及“所有基类成分”

  2. 不要尝试以某个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. 以对象管理资源

  1. 为了防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。必须lock_guard。
  2. 常备使用的有unique_ptr和shared_ptr

14. 在资源管理中心类中小心copy行为

常见的做法是抑制copy

15. 在资源管理类中提供对原始资源的访问

16. 成对使用new和delete时要采取相同的形式

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,表明运行期也无法修改该值,所以尽量采用该方法进行值传递。

猜你喜欢

转载自blog.csdn.net/m0_38126105/article/details/84504535
今日推荐