zoukankan      html  css  js  c++  java
  • c++6个默认函数

    在C++中,声明自定义的类型之后,编译器会默认生成一些成员函数,这些函数被称为默认函数。其中包括

    (1)(默认)构造函数

    (2)拷贝(复制)构造函数

    (3)拷贝(复制)赋值运算符

    (4)移动构造函数

    (5)移动赋值运算符

    (6)析构函数

    另外,编译器还会默认生成一些操作符函数,包括

    (7)operator ,

    (8)operator &

    (9)operator &&

    (10)operator *

    (11)operator ->

    (12)operator ->*

    (13)operator new

    (14)operator delete

    显式缺省函数(=default)

    如果类设计者又实现了这些函数的自定义版本后,编译器就不会去生成默认版本

     #include <iostream>
      using namespace std;
      
      class Test 
      {
      public:
          Test() = default;  // 显式指定缺省函数
          Test(int i) : data(i) {}
      
     private:
         int data;
     };
     
     int main()
     {
         std::cout << std::is_pod<Test>::value << std::endl;  // 1
     }

    显式删除函数(=delete)

    另一方面,有时候可能需要限制一些默认函数的生成。

    例如:需要禁止拷贝构造函数的使用。以前通过把拷贝构造函数声明为private访问权限,这样一旦使用编译器就会报错。

    而在C++11中,只要在函数的定义或者声明后面加上”= delete”就能实现这样的效果(相比较,这种方式不容易犯错,且更容易理解):

    #include <iostream>
    using namespace std;
    
    class Test
    {
    public:
        Test() = default;  // 显式指定缺省函数
        Test(int i) : data(i) {}
        Test(const Test& t) = delete; // 显式删除拷贝构造函数
    
    private:
        int data;
    };
    
    int main()
    {
        Test objT1;
    //    Test objT2(objT1); // 无法通过编译
    }

    其他应用

    (1)= default和= delete 能够更加精准的控制类的默认函数版本。其中,= default同样也能在类外的定义中修饰成员函数:

    总之,default只能用于6个特殊成员函数,但delete可用于任何成员函数。

  • 相关阅读:
    [转]oracle数据库定时任务dbms_job的用法详解
    身份证号码的正则表达式及验证详解(JavaScript,Regex)
    js数组操作
    jq滚动到底部加载更多方法
    jq之实现轮播
    node之npm一直出错
    Jq之21点游戏
    移动端屏幕适配viewport
    meta属性
    用户体验之表单结构
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/12875913.html
Copyright © 2011-2022 走看看