zoukankan      html  css  js  c++  java
  • 《Effective C++》笔记:III(转载)

      转自:http://www.cnblogs.com/destino74/p/3960802.html

      

      条款5:Know what functions C++ silently writes and calls

      

    译:了解C++默默编写并调用哪些函数

    在C++中,写一个空类,编译器会自动为它声明一个copy构造函数、一个copy assignment操作符和一个析构函数。如果没有声明任何构造函数,编译器也会自动声明一个default构造函数。

    如下:

    class Empty{};

    这就相当于

    class Empty{
    public:
        Empty(){...}
        Empty(const Empty& rhs){...}
        ~Empty(){...}
        Empty& operator=(const Empty& rhs){...}
    }

    关于构造函数、copy构造函数的东西前两篇已经有介绍了。

    条款6:Explicitly disallow the use of compiler-generated functions you do not want

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

    在一些场合,如果你不想对象内的某个函数被调用,可以把这些函数声明成private隐藏起来,这也是Java中实现工厂模式禁止new一个对象的伎俩。

    但其实这并不保险,这些函数依然可以在成员函数或friend函数中被调用,当然,你可以人为的明令禁止调用这些函数。

    书中提到的解决方法是只声明不定义。这就是我常犯的错误,声明了函数却没有定义函数体,在编译时会给出一个”无法解析的外部符号”这样的错误。

    而利用这一点,就可以达到屏蔽自动生成的函数这一目的。

    另一个方法就是实现一个类似Uncopyable接口的类,把需要隐藏的函数声明为私有函数,然后在派生类中私有继承这个Uncopyable类。

    将成员函数声明为private且不实现,可禁止编译自动提供的函数。使用像Uncopyalbe这样的基类也能达到相同的目的。

    条款7:Declare destructors virtual in polymorphic base classes

    译:为多态基类声明virtual析构函数

    为什么要为多态基类声明virtual析构函数(虚析构函数)呢?原因是当一个指向派生类的基类指针被销毁时,会调用基类的析构函数,而这时派生类 的析构函数未能执行,派生类对象的成员变量 很可能没被销毁,这就为资源泄漏和莫名其妙的BUG提供温床,相应地增加你在调试上花的时间。

    所以,在所有含virtual函数(虚函数)的类中,都应该声明virtual析构函数,这使它在不同的派生类中有不同的表现,从而让派生类中的资源在销毁时能被正确释放。

    值得一提的是,当类中不含虚函数时,这往往意味着该类并不是设计来被继承,就不该声明虚析构函数,因为这从未声明一样。

    书中提到了不应该继承任何不带virtual析构函数的类(如所有STL容器),在学习STL查阅资料时就了解到, 继承STL的作法给会造成各种糟糕的后果,因此自己在使用的时候总是以组合代替继承,就没有遇到过书中提到的、以及网上大量因继承STL而造成的问题。

    带多态性质的基类应该声明一个virtual析构函数。任何带有virtual函数的类都应该拥有一个virtual析构函数。

    如果一个类不希望作为基类被继承或不是为了具备多态性而设计,就不该声明virtual析构函数。(不应该设计STL容器派生类)

  • 相关阅读:
    中介者模式
    Redis安装
    观察者模式
    第三天:创建型模式--建造者模式
    第二天:创建型模式--抽象工厂模式
    第一天:创建型模式--工厂方法模式
    17天17个Python设计模式--目录
    Python模拟登陆新版知乎
    Flask架站基础篇(八)--SQLAlchemy(2)
    Flask架站基础篇(七)--SQLAlchemy(1)
  • 原文地址:https://www.cnblogs.com/lance-ehf/p/4164132.html
Copyright © 2011-2022 走看看