zoukankan      html  css  js  c++  java
  • =default =delete

    =default, =delete

    如果你自行定义一个 ctor,那么编译器就不会再给你一个 default ctor(包括了构造函数,拷贝构造函数,拷贝赋值函数)。

    如果你强制加上了 =default,就可以重新获得并使用 default ctor。

    Big Three

    就是所谓的:

    • 构造函数
    • 拷贝构造函数
    • 拷贝赋值函数
    • 析构函数

    Big Five

    就是所谓的:

    • 构造函数
    • 拷贝构造函数
    • 移动构造函数(move ctor)
    • 拷贝赋值函数
    • 移动赋值函数(move assignment)
    • 析构函数

    =default 用于 Big-Five 之外是没有任何意义的,编译器会报错!!

    =delete 可用于任何函数身上 (=0 只能用于 virtual 函数上)

    Know what functions C++ silently writes and calls

    什么时候 empty class 不再是 empty 呢?当 C++ 处理过它之后!

    是的,如果你自己没有声明,编译器就会为它声明一个 copy ctor、一个 copy assignment operator 和一个 dtor (都是所谓 synthesized version)。如果你没有声明任何 ctor,编译器也会为你声明一个 default ctor。所有这些函数都是 public 且 inline 的。

    class Empty{};
    
    {
        Empty e1;
        Empty e2(e1);
        e2 = e1;
    }
    

    例如上述代码,Empty 类是空的,但是当 Big-Three 需要被调用时,编译器就会为这个空类自动生成 Big-Three,如下所示:

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

    那什么时候需要自己写 Big-Three ,什么时候用默认的就可以了呢?

      1. 当类中存在 pointer member 时一般都需要自己写一个 Big-Three,来管理指针。
      1. 当类中涉及堆内存分配时需要自己写 Big-Three

    其他的情况一般用编译器默认的 Big-Three 即可。。。

  • 相关阅读:
    如何让pc端网站在手机上可以等比缩放的整个显示
    CSS
    常见的IE布局兼容问题
    CSS : 使用 z-index 的前提
    CSS : object-fit 和 object-position实现 图片或视频自适应
    CSS
    vscode
    如何识别Form字段中一对多或者多对多字段
    window.open简单使用
    由一个模型拿它的名字、app的名字、字段对象以及字段对象中的属性
  • 原文地址:https://www.cnblogs.com/Codroc/p/13998383.html
Copyright © 2011-2022 走看看