本文章属于专栏- 概述 -《业界C++进阶建议整理》-CSDN博客
本文列出《Effective C++》的11-20条的个人理解的极精简版本。
- 11、在operate=中处理自我赋值(例如代码 a = a)
- 绝大部分情况下,类的成员变量以及自身的operate=都是默认的,不用关心这个问题
- 如果operate=是自定义的,且不希望a = a时走自定义逻辑,就先判断this指针和输入的地址是否一样,一样则直接返回。或者栈上新建一个对象a',和a进行swap
- 12、复制对象勿忘每个成分
- 当有基类时,需要调用基类的operator=
- 另外拷贝构造和赋值构造,不要相互调用,没有物理意义。如果有共同逻辑就抽象一个函数代码
- 13、以对象管理资源
- 使用shared_ptr或者unique_ptr
- 个人见解:不要用auto_ptr(c++11已废弃,c++17中移除)
- 14、实现自己的资源管理类时,小心copying行为
- 仔细思考operate=的写法,一些底部资源,如mutex的operator=是被禁止的。而指针的拷贝,则需要计数,以保证资源正确释放
- 个人见解:包含mutex的对象不要拷贝或者移动。在应用中,这样的对象一定不是大量了,如果需要,就新建,对整体性能影响不大。如果要传递,就传递对象指针或者引用,而不是本身。
- 15、在资源管理类中提供对原始资源的访问
- 个人见解:资源释放类的目的是为了正确的释放资源,但是将原始资源暴露,是有可能出现原始指针被客户使用时,资源管理类把资源释放了。这里需要开发者格外小心。如果获取指针的函数是同步调用没有问题,如果异步调用,可能会有内存泄漏或者遇到空指针;
- 16、new和delete成对调用
- new [] + delete [] 或者new + delete
- 17、以独立的语言,将newed对象放入智能指针
- fun(shared_ptr<A>(new A), fun2()),对同一行代码,编译器有重新排列顺序的操作顺序的自由度,可能执行顺序是new A、fun2、shared_ptr<A>,如果fun2调用异常,会导致资源泄漏
- 18、让接口容易被正确使用、而不是误用
- 个人见解:这是一个经验之谈,没有太多实质性的点,主要是尽量让接口语意明确,类型简单
- 19、设计class犹如设计type
- 个人见解:这是一个经验之谈,设计class要考虑创造、销毁、初始化、赋值等
- 20、输入参数用const引用代替pass-by-value
- 对内置类型、STL的迭代器、函数对象,使用pass-by-value
- 其他对象使用const引用