C++11 (五) - default、delete


一、C++ 默认函数

我们知道在C++中若不显著定义以下函数,则编译器会默认提供:

  1. 构造函数
  2. 析构函数
  3. 拷贝构造函数
  4. 拷贝赋值函数,即 operator=
  5. 移动构造函数

C++11 为了增强对类默认函数的控制,引入了两个新关键字:

  1. default: 告诉编译器生成函数默认的缺省版本
  2. delete: 告诉编译器不生成函数默认的缺省版本

二、default

若我们在类中自定义了上述函数之后,编译器便不再生成默认版本,如果需要我们要显式的写上其对应的默认函数版本:

#include <iostream>
using namespace std;

class Test
{
public:
    Test(const int a) : m_a(a) { }
    int getA() const {return m_a;}
    
private:
    int m_a;
};

int main()
{
    Test test(1);
    cout << test.getA() << endl; // 1
    Test test1; // 编译失败,报错: no matching function for call to ‘Test::Test()’
    
    return 0;
}

示例定义了一个对象 test1,该对象将会使用 Test 类的无参构造函数,而该默认构造函在我们提供了自定义构造函数之后就不会再生成了,因此会报错
解决方式是:在该类中显式的提供无参构造函数

Test() { } 

但这样可能让编译器失去优化功能,因此最后使用 = default; 来修饰

Test() = default;

三、delete

当我们不需要某些默认函数的时候,在C++11之前,我们经常的做法是将其声明为 private 成员函数,这样若在类外操作这些这些函数的时候,编译器便会报错

#include <iostream>
using namespace std;

class Test 
{
public:
    Test(const int a) : m_a(a) { }
    int getA() const {return m_a;}

private:
    Test(const Test&);
    Test& operator= (const Test&);
    
    int m_a;
};

int main()
{
    Test test(1);
    cout << test.getA() << endl; // 1

    // Test test1(test);
    // 报错:error: ‘Test::Test(const Test&)’ is private
  
    // Test test1(2);
    // test1 = test;
    // 报错:error: ‘Test& Test::operator=(const Test&)’ is private
    
    return 0;
}

这样虽然能够达到效果,但是不够直观和简洁。对于追求高效以及简洁来说,可以这样:

#include <iostream>
using namespace std;

class Test
{
public:
    Test(const int a) : m_a(a) { }
    int getA() const {return m_a;}
    
    Test(const Test&) = delete;
    Test& operator= (const Test&) = delete;

private:
    int m_a;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值