C++中构造函数delete和default

 参考博客:(136条消息) C++构造函数的default和delete_王小闹儿的博客-CSDN博客_构造函数=delete

(136条消息) C++中的默认函数与default和delete用法_云梦泽1989的博客-CSDN博客_c++析构函数 default

一、类中的默认函数
a.类中默认的成员函数
1.默认构造函数

2.默认析构函数

3.拷贝构造函数

4.拷贝赋值函数

5.移动构造函数

6.移动拷贝函数

b.类中自定义的操作符函数
1.operator

2.operator&

3.operator&&

4.operator*

5.operator->

6.operator->*

7.operator new

8.operator delete

class DataOnly {
public:
    DataOnly ()                  // default constructor
    ~DataOnly ()                 // destructor

    DataOnly (const DataOnly & rhs)              // copy constructor
    DataOnly & operator=(const DataOnly & rhs)    // copy assignment operator

    DataOnly (const DataOnly && rhs)         // C++11, move constructor
    DataOnly & operator=(DataOnly && rhs)    // C++11, move assignment operator
};

同时C++规定,一旦程序员实现了这些函数的自定义版本,则编译器不会再自动生产默认版本。注意只是不自动生成默认版本,当然还是可手动生成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认的无参版本了。我们可以通过使用关键字default来控制默认构造函数的生成,显式地指示编译器生成该函数的默认版本。比如:
 

class MyClass
{
  public:
    MyClass()=default;  //同时提供默认版本和带参版本,类型是POD的
    MyClass(int i):data(i){}
  private:
    int data;
};

有些时候我们希望限制默认函数的生成。典型的是禁止使用拷贝构造函数,以往的做法是将拷贝构造函数声明为private的并不提供实现,这样当拷贝构造对象时编译不能通过,C++11则使用delete关键字显式指示编译器不生成函数的默认版本。比如:

class MyClass
{
  public:
     MyClass()=default;
     MyClass(const MyClass& )=delete;
  ......
}

而关于delete的显式删除,并非局限于成员函数,由此我们也知default是只局限作用于类的部分成员函数的。于是我们还可用delete来避免不必要的隐式数据类型转换。比如:

class MyClass
{
  public:
    MyClass(int i){};
    MyClsss(char c)=delete;  //删除char版本的构造函数
};
void Fun(MyClass m){}
int main()
{
  Func(3);
  Func('a');  //编译不能通过
  MyClass m1(3);
  MyClass m2('a');  //编译不能通过
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值