zoukankan      html  css  js  c++  java
  • 《Effective C++》构造、析构、赋值运算

    Item 05:了解C++默默编写并调用了哪些函数
    总结:编译器可以暗自为class创建default 构造函数、copy构造函数、copy assignment操作符,以及析构函数。
    (这一小节比较简单,想要深入了解可以翻阅深入探索C++对象模型的笔记)


    Item 06:若不想明确使用编译器自动声称的函数,就该明确拒绝
    方法1:将该成员函数声明为private
    不过这种方法有个缺点,就是该class的friend函数和member函数可以调用该函数,所以还需要将该函数的函数体写成空。
    总结:为驳回编译器(暗自)提供的机能,可将相应的成员函数声明为private并且不给予实现。


    Item 07:为多态基类声明virual 析构函数
    当子类对象由一个base class的指针删除的时候,而该base类带有一个non-virtual 的析构函数,其结果未定义——实际执行的时候通常是该类的子类部分没有被销毁。
    解决办法:给base class一个virtual析构函数,这样才能达到目的。
    总结
    1.polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果该类带有任何virtual函数,它就应该拥有一个virtual的析构函数。
    2.class的设计目的如果不是作为base class使用,或者不是为了具备多态性质,就不应该声明virtual 析构函数。


    Item 08:别让异常逃离析构函数
    总结
    1.析构函数绝对不要吐出异常。如果一个析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常并且吞下它们或者关闭程序。
    (这一点很好理解,如果代码运行跳出了析构函数,那么后面的销毁操作就可能不会被执行,这样极易造成内存泄露!)
    2.如果客户需要在对某个操作函数运行期间抛出的异常作出反应,那么class应该提供一个(而不是在析构函数中)普通的函数来处理。


    Item 09:绝对不在构造和析构函数中调用virtual函数
    在子类对象的base class构造期间,对象的类型是base class而不是derived class。不止virtual函数会被编译器解析为base class的,也会把对象视为base class类型。所以在这种情况下调用virtual函数,往往得不到正确的结果。
    同样的道理也适用于析构函数。
    总结::在构造和析构期间绝对不要调用virutal函数,因为该函数的调用绝对不会下降到derived class层。(比起当前执行virtual函数的这这一层)。


    Item 11:在operator=中处理自我赋值
    总结:
    1.请确保当前对象和赋值的对象不是同一个对象,其中包括比较“来源对象”和“目标对象”的地址、语句顺序和copy-and-swap。
    2.确保任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为依旧正确。


    Item 12:确保复制对象时候不要忘记每一部分
    总结:
    1.copy函数应该确保复制“对象内的所有成员变量”及“所有的base class 成分”。
    2.不要尝试以某个copy函数实现另一个copying函数,应该将共同机能放进第三个函数中,由两个函数共同调用。

    https://github.com/li-zheng-hao
  • 相关阅读:
    css基础面试题
    hack-checkbox
    装饰性属性
    【CF809E】Surprise me!
    [SCOI2012]奇怪的游戏
    [HAOI2018]奇怪的背包
    CF1139D Steps to One
    [CTSC2018]假面
    写在省选前
    [SDOI2015]寻宝游戏
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053757.html
Copyright © 2011-2022 走看看