Effective C++ 笔记(2.构造/析构/赋值运算)

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

如果打算在一个”内含reference成员“的class内支持赋值操作(assignment),你必须自己定义copy assignment操作符。
如果某个base classes将copyassignment操作符声明为private,编译器将拒绝为其derived classes生成一个copy assignment。

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

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

如果你不声明copy构造函数或copy assignment操作符,编译器可能为你产出一份,于是你的class支持copying。如果你声明它们,你的class还是支持copying。但这里的目标却是要阻止copying。

所有编译器产出的函数都是public。为阻止这些函数被创建出来,你得自行声明它们。因此可以将copy构造函数或copy assignment操作符声明为private。

请记住:为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。

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

欲实现出virtual函数,对象必须携带某些信息,主要用来在运行期决定哪一个virtual函数该被调用。这份信息通常是由一个所谓vptr指针指出。vptr指向一个由函数指针构成的数组,称为vtbl;每一个带有virtual函数的class都有一个相应的vtbl。当对象调用某一virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vtbl-编译器在其中寻找适当的函数指针。

析构函数的运作方式是,最深层派生的那个class其析构函数最先被调用,然后是其每一个base class的析构函数被调用。

并非所有base classes的设计目的都是为了多态用途。

请记住:
  • polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual函数。
  • Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性(polymorphically),就不该声明virtual析构函数。

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

请记住:
  • 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。
  • 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。

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

在base class构造期间,virtual函数不是virtual函数。

请记住:
      在构造和析构期间不用调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层。)

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

请记住:
令赋值(assignment)操作符返回一个reference to *this。

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

请记住:
  • 确保当对象自我赋值时operator=有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。
  • 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

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

设计良好之面向对象系统会将对象的内部封装起来,只留两个函数负责对象拷贝(复制),那便是带着适切名称的copy构造函数和copy assignment操作符,称之为copying函数。
  • Copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”。
  • 不用尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个coping函数共同调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值