zoukankan      html  css  js  c++  java
  • Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数

    一、如果用户没有提供构造函数、copy构造函数、copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来。编译器生成的这些函数都是public且inline。

      当你写下这样一个类的时候:

    class Empty {};

      如果上述的函数是被需要的话,那么编译自动会帮你把类修改为,如下:

    class Empty
    {
    public:
        Empty() {...};    //这里进行数据成员的默认初始化,如果有虚函数的话,这里还会配置好虚函数表
        Empty(const Empty& rhs) {…}
        ~Empty() {..} //这里先对数据成员析构,然后销毁虚函数表等
        Empty& operator=(const Empty& rhs) {...}
    };

      有待在inside c++ object model中细致考证(注:其实对于copy构造函数、赋值操作符重载,并不是你自己没有编写,当需要被调用的时候就被生成!如果编译器判断这个类的需要生成的copy构造函数等是trival,平凡的copy构造函数,那么编译器也不会生成copy'构造函数等,只会在其需要copy构造函数的或者赋值操作符重载的地方,施行逐位拷贝)

    二、注意,编译器产出的析构函数是个non-vitual,除非这个class的base class自身声明有virtual析构函数。

    三、注意,在一个“内含reference成员”的class内支持赋值操作,必须自己定义copy assignment操作符。对于“内含const成员”的class,同样如此。

      不然编译器会提示:

    non-static reference member ‘std::string& A::m_name’, can’t use default assignment operator

    或者

    non-static const member ‘const string A::m_name’, can’t use default assignment operator

    四、如果某个base class将copy assignment操作符声明为private,编译器将拒绝为其derived class 生成一个copy assignment操作符。

  • 相关阅读:
    行转列
    multipath 安装配置
    网卡绑定
    numa对MySQL多实例性能影响
    Fatal NI connect error 12170
    REVOKE DBA权限要小心
    Oracle 数据库整理表碎片
    listagg 函数
    10046 事件补充
    tkprof 解释
  • 原文地址:https://www.cnblogs.com/wangjzh/p/4064066.html
Copyright © 2011-2022 走看看