C++11新特性:default函数、delete函数

1、默认函数:

C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。

如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数

2、=default:

C++11 标准引入了一个新特性:"=default"函数。程序员只需在函数声明后加上“=default;”,就可将该函数声明为 "=default"函数,编译器将为显式声明的 "=default"函数自动生成函数体

  • "=default"函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数;
  • "=default"函数既可以在类体里(inline)定义,也可以在类体外(out-of-line)定义。

我们看一些示例:

class X { 
public: 
    X() = default; //该函数比用户自己定义的默认构造函数获得更高的代码效率
    X(int i) { 
        a = i; 
    }
private: 
    int a; 
}; 

X obj;

// "=default"函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。
class X1{
public:
    int f() = default;      // err , 函数 f() 非类 X 的特殊成员函数
    X1(int, int) = default;  // err , 构造函数 X1(int, int) 非 X 的特殊成员函数
    X1(int = 1) = default;   // err , 默认构造函数 X1(int=1) 含有默认参数
};

// "=default"函数既可以在类体里(inline)定义,也可以在类体外(out-of-line)定义。
class X2{
public:
    X2() = default; //Inline defaulted 默认构造函数
    X2(const X&);
    X2& operator = (const X&);
    ~X2() = default;  //Inline defaulted 析构函数
};

X2::X2(const X&) = default;  //Out-of-line defaulted 拷贝构造函数
X2& X2::operator= (const X2&) = default;   //Out-of-line defaulted  拷贝赋值操作符

3、=delete:

为了能够让程序员显式的禁用某个函数,C++11 标准引入了一个新特性:"=delete"函数。程序员只需在函数声明后上“=delete;”,就可将该函数禁用。

  • "=delete"函数特性可用于禁用类的某些转换构造函数,从而避免不期望的类型转换;
  • "=delete"函数特性还可以用来禁用某些用户自定义的类的 new 操作符,从而避免在自由存储区创建类的对象;
  • "=delete"函数特性还可以用来禁用拷贝构造函数、拷贝赋值函数;

示例:

class X3 {
public:
    X3();
    X3(const X3&) = delete;  // 声明拷贝构造函数为 deleted 函数
    X3& operator = (const X3 &) = delete; // 声明拷贝赋值操作符为 deleted 函数
};
class X4 {
public:
    X4(double){}
    X4(int) = delete;// "=delete"函数特性还可用于禁用类的某些转换构造函数,从而避免不期望的类型转换
};
// "=delete"函数特性还可以用来禁用某些用户自定义的类的 new 操作符,从而避免在自由存储区创建类的对象
class X5{
public:
    void *operator new(size_t) = delete;
    void *operator new[](size_t) = delete;
};

void mytest(){
    X4 obj1;
    X4 obj2=obj1;   // 错误,拷贝构造函数被禁用

    X4 obj3;
    obj3=obj1;     // 错误,拷贝赋值操作符被禁用

    X5 *pa = new X5;      // 错误,new 操作符被禁用
    X5 *pb = new X5[10];  // 错误,new[] 操作符被禁用
    return;
}

 参考:https://www.cnblogs.com/lsgxeva/p/7787438.html

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值