effective C++ 读书笔记(二)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

第二章 构造 / 析构 / 赋值函数

条款05:了解C++默默编写并调用哪些函数

n        编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数

copy构造函数和copy assignment操作符,编译器创建的版本只是单纯地将来源对象的每一个non-static成员变量拷贝到目标对象。

条款06:若不想使用编译器自动生成的函数,就该明确拒绝

n        为驳回编译器自动提供的技能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。

将copy构造函数或copy assignment操作符声明为private。可以阻止编译器暗自创建其专属版本。但是有个问题,member函数和friend函数还是可以调用这个private函数。

自定一个Uncopyable类:

class Uncopyable {

         protected:

                   Uncopyable(){}

                   ~Uncopyable(){}

         private:

                   Uncopyable(constUncopyable&);

                   Uncopyableoperator=(const Uncopyable&);

}

为组织A对象被拷贝,唯一需要做的就是继承Uncopyable。

class A : private Uncopyable {

….

};

当编译器试着生成一个copy函数时,这些函数会尝试调用其base class的对应兄弟,但是base class的拷贝函数是private,会被编译器拒绝。这种技术可能导致多重继承。

条款07:为多态基类声明virtual析构函数

n        polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。

n        classes的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不该声明virtual析构函数。

当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,就会导致对象的derived成分没被销毁。

任何class只要带有virtual函数都几乎确定应该也有一个virtual析构函数

条款08:别让异常逃离析构函数

n        析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们或结束程序

n        如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。

条款09:绝不在构造和析构过程中调用virtual函数

n        在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class

base class的构造函数如果调用了virtual函数,这时derived class还没生成,不可能下降至derived class

条款10:令operator=返回一个reference to *this

n        令赋值操作符返回一个reference to *this

A& operator=(const A&) {

         return *this;

}

条款11:在operator=中处理“自我赋值”

条款12:复制对象时勿忘其每一个成分

n        copying函数应该确保赋值“对象内的所有成员变量”及“所有baseclass成分”

n        不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个copying函数共同调用

effective C++读书笔记 11. 1)       如果你为class添加一个成员变量(尤其是类成员变量),你必须同时修改copying函数,所有构造函数以及任何非标准形式的operator=。 2)       copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”。在子类中要注意调用基类的构造函数(或copying构造,或operator=等)来完成对基类的操作。 3) 阅读详情

相关推荐

Effective C++读书笔记

Effective C++读书笔记 条款26:尽可能延后变量定义式的出现时间 尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。 条款27:尽量少做转型动作 如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts。如果有个设计需要转型动作,试着发展无需转型的替代设计。 如果转型是必要的,试着将它隐藏于某个函数背后。客户随后可以调用该函数,而不需要将转型放进他们自己的代码内。 尽量使用C+±style转型,不要使用旧式转型。前者很容易辨识出来,而且也比较有

WINGREZ‘S BLOG 418

Effective C++ 读书笔记

所谓编译单元是指产出单一目标文件的那些源码,包括源码文件和其所包含的头文件。static对象是指其寿命是从被构造出来到程序结束为止。该对象包括global对象、namespace内的对象、文件内、class内、函数内被声明为static的对象。函数内的static对象称为local static对象,其他均为non-local static对象。

qq_53660404的博客 765

Effective C++ | 读书笔记

第三版第三四章内容

m0_74795952的博客 1075

Effective C++读书笔记

19、避免返回handles(指针,引用,迭代器)指向对象内部成分 即使函数前面加上const,变成 const Point& upperLeft() const{} 意味着调用者拿到Point引用但是不能涂写,但是让调用者拿到了引用,通过拿到的引用对象调用里面的成员,如果执行这句话时该引用已经不存在(销毁),那么会变成一个空悬、虚吊的对象 20、了解inlining的里...

zhangxiaofan666的博客 242

Effective C++ 读书笔记

条款5:定义好一个空类时,编译器会自动生成无参构造函数、copy构造函数、copy assignment(拷贝赋值)操作符和析构函数 程序员自定义的函数的优先级高于编译器自动生成的,当程序员自己实现了上述函数时,编译器就不会生成默认的函数。但是,当编译器生成的默认函数无法满足你的功能时,就需要程序员自己去定义函数了。 条款6:当不想使用编译器生成的默认函数时,将这些不想使用的默认函数自己声明为private,并且只声明,不实现 如果仅仅声明为private的,且实现了(即使是空实现),类的friend

如沐清风的博客 179

Effective C++读书笔记

、构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数,一个copy assignment操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会成为你声明一个默认构造函数。所有这些函数都是public且inline。 惟有当这些函数被需要(被调用),它们才会被编译器创建出来。 注意

u010358881的专栏 394

Effective C++读书笔记

构造/析构/赋值运算 几乎你写的每个class都会有一或多个构造函数、一个析构函数、一个拷贝赋值操作符。如果这些函数犯错,会导致深远且令人不愉快的后果,遍及整个classes。所以确保它们行为正确是生死攸关的大事。 条款05:了解C++默默编写并调用哪些函数 如果你自己没声明,编译器就会为类声明(编译器版本的)一个拷贝构造函数,一个拷贝赋值操作符和一个析构函数。此外如果你没有声明任何构造

小李的专栏 609

Effective C++ 条款总结 读书笔记

Item Effective C++ 条款 item_20 Avoid data members in the public interface This rule warns you if data members are present in the public interface. Instead of making data members public, you should

聚精会神搞建设 1448

Effective C++读书笔记()

条款5:了解C++默默编写并调用哪些函数 如果打算在一个类中内含引用成员的函数中赋值,必须自己定义一个copy assignment 操作符 如果某个base class将copy assignment 声明为private,则在derived中编译器拒绝为其生成copy assignment操作符,因为derived class 可以调用base class 的copy函数. 条款6:防止使用编...

人总是要有梦想的QAQ的博客 101

effective c++读书笔记(

Constructors, Destructors, Assignment operators

VanityLost_CY的博客 327

《More Effective C++读书笔记)Exception 异常

这事篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点。我推荐学C++的人都好好读一遍Effective C++ 系列,真是好书啊,对于学完C++ 基础知识的人,这是本高阶秘籍。 笔记 条款 9 - 15 关注的主题是异常。关注1、异常可能引起的资源泄露(强烈推荐使用智能指针)2、异常是如何抛出的和3、异常的成本。目的...

weixin_30896825的博客 123

effective C++读书笔记

2. 构造/析构/赋值运算(Constructors,Destructors,and Assignment Operators) 条款05: 了解C++ 默默编写并调用哪些函数(Knowwhat functions C++ silently writes and calls) 本条款讲了编译器自动为你创建了哪些函数。 用户定义一个empty class,当C++ 处理过它之后,如果

necrazy的专栏 791

【转】effective C++读书笔记

<br />转自:http://hi.baidu.com/a024014/blog/item/617b690ac43e8b1a95ca6ba2.html<br /> <br />类和函数:设计与声明<br /><br /><br />条款18 :争取使类的接口完整并且最小<br /><br />条款19 :分清成员函数,非成员函数和友元函数<br />如果f 必须是虚函数,就让它成为C 的成员函数。<br />operator>>和operator<<决不能是成员函数。如果f 是operator>>或o

hq0520的专栏 346

《More Effective C++读书笔记-技术()

30、proxy classes(代理类)可以用两个类来实现维数组:Array1D是一个一维数组,而Array2D则是一个Array1D的一维数组。Array1D的实例扮演的是一个在概念上不存在的一维数组,它是一个代理类。代理类最神奇的功能是区分通过operator[]进行的是读操作还是写操作,它的思想是对于operator[]操作,返回的不是真正的对象,而是一个 proxy类,这个代理类记录了对

爱橙子的OK绷的专栏 640

More Effective C++读书笔记

1、不要试图重载||,&&操作符,因为它们使用短路求值法(一旦确定了布尔表达式的真假值,即使还有部分表达式没有被测试,布尔表达式也停止运算),而重载之后采用的是函数调用法。首先当函数被调用时,需要运算其所有参数,所以调用函数functions operator&& 和 operator||时,两个参数都需要计算,换言之,没有采用短路计算法。第C++语言规范没有定义函数参数的计算顺序,所以没有办

孟源的专栏 1048
上一篇: effective C++ 读书笔记(一)
下一篇: effective C++ 读书笔记(三)
kindlucy
博客等级 码龄19年 64粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值