zoukankan      html  css  js  c++  java
  • c++11 默认函数的控制

    1. 类与默认函数:

    C++中声明自定义的类,编译器会默认生成未定义的成员函数:

    构造函数

    拷贝构造函数

    拷贝赋值函数(operator=)

    移动构造函数

    移动拷贝函数

    析构函数

    编译器还会提供全局默认操作符函数:

    operator,

    operator &

    operator &&

    operator *

    operator ->

    operator ->*

    operator new

    operator delete

    2. default delete

    #include <type_traits>
    #include <iostream>
    using namespace std;
    
    class NoCopyCator {
      public:
        NoCopyCator() = default;
    
        NoCopyCator(const NoCopyCator&) = delete;  //阻止使用拷贝构造函数
    };
    
    int main() {
      NoCopyCator a;
      NoCopyCator b(a);  //无法通过编译
    
      return 0;
    }

    =default修饰的函数为显式缺省函数

    =delete修饰的函数为删除函数

    delete可以避免一些不必要的隐式数据类型转换。

    class ConvType {
      public:
        ConvType(int i) {}
        ConvType(char c) = delete;
    };
    
    void Func(ConvType ct) {}
    
    int main() {
      Func(3);
      Func('a');  //无法通过编译
     
      ConvType ci(3);
      ConvType cc('a');  //无法通过编译
    
      return 0;
    }

    //delete 不局限于缺省版本的类成员函数或者全局函数,对于普通的函数也可以通过显式删除来禁止类型转换
    void Func(int i) {}
    void Func(char c) = delete;

    int main() {
    Func(3);
    Func('c'); //无法通过编译
    return 1;
    }

    显示删除可以删除自定义类型的operator new操作来避免在堆上分配该class对象。

    #include <cstddef>
    
    class NoHeapAlloc {
      void* operator new(std::size_t) = delete;
    };
    
    int main() {
      NoHeapAlloc nha;
      NoHeapAlloc* pnha = new NoHeadAlloc;  //编译失败
      return 0;
    }

    如果需要在指定内存位置进行内存分配,并且不需要析构函数来完成一些对象级别的清理。可以通过显示删除析构函数来限制自定义类型在栈上或者静态的构造。

    #include <cstddef>
    #include <new>
    
    extern void* p;
    
    class NoStackAlloc {
      public:
        ~NoStackAlloc() = delete;
    };
    
    int main() {
      NoStackAlloc nsa;   //无法通过编译
      new (p) NoStackAlloc(); // placement new, 假设p无需调用析构函数
    
      return 0;
    }
  • 相关阅读:
    RabbitMQ 内存控制 硬盘控制
    Flannel和Docker网络不通定位问题
    kafka集群扩容后的topic分区迁移
    CLOSE_WAIT状态的原因与解决方法
    搭建Harbor企业级docker仓库
    Redis哨兵模式主从持久化问题解决
    mysql杂谈(爬坑,解惑,总结....)
    Linux的信号量(semaphore)与互斥(mutex)
    SIP协议的传输层原理&报文解析(解读rfc3581)(待排版) && opensips
    SIP协议的传输层原理&报文解析(解读RFC3261)(待排版)&&启动
  • 原文地址:https://www.cnblogs.com/sssblog/p/11459451.html
Copyright © 2011-2022 走看看