构造函数= default;_C++11新特性之 “=default” 、“=delete”

本文介绍了C++11的新特性,包括=default和=delete的使用。首先概述了这两个关键字的功能,接着探讨了类与默认函数的关系。然后详细讲解如何使用=delete来限制特定函数的生成,最后阐述=default的适用场景。
摘要由CSDN通过智能技术生成

1、 =default 和=delete 概述

     任何事物的出现都必然有着其出现的理由,伴随着每一个新的概念产生都会带来一系列的便利和价值。C++在不断的演变与发展,与此同时,伴随着许多新的特性和功能产生。=default、=delete 是C++11的新特性,分别为:显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器不生成函数默认的缺省版本)。C++11中引进这两种新特性的目的是为了增强对“类默认函数的控制”,从而让程序员更加精准地去控制默认版本的函数。其具体的功能和使用方法下面将一一道来。

2、 类与默认函数

     在讲解关键字 default和delete 之前,先对类和类的默认函数作下描述与说明,从而加深对这两个关键字的理解与认知。既要知其然,也要知其所以然。C++中,当我们设计与编写一个类时,若不显著写明,则类会默认为我们提供如下几个函数:      (1)构造函数     (2)析构函数     (3)拷贝构造函数     (4)拷贝赋值函数(operator=)     (5)移动构造函数      以及全局的默认操作符函数:     (1)operator,     (2)operator &
     (3)operator &&
     (4)operator *
     (5)operator->
     (6)operator->*
     (7)operator new
     (8)operator delete      注:若我们在类中实现了这些版本之后,编译器便不会生成其对应的默认函数版本,这时需要我们显式的写上其对应的默认函数版本。      如例1所示:
/************************************************************************* * File Name: Student.cpp * Author:    The answer * Function:  Other         * Mail:      2412799512@qq.com  * Created Time: 2018年07月17日 星期二 23时08分20秒 ************************************************************************/#includeusing namespace std;class Student{
     public:    Student(const int a,const int b)        :m_a(a)        ,m_b(b)    {
         }int getA()const{return m_a;}int getB()const{return m_b;}private:int m_a;int m_b;};int main(int argc,char **argv){
     Student stu(1,2);cout<cout<    Student stu1;           //编译失败,报错: no matching function for call to ‘Student::Student(
拷贝构造函数 "= delete" 是一个C++11中的新特性,允许将拷贝构造函数定义为删除的函数。当某个类的拷贝构造函数被定义为 "= delete" 时,意味着该类对象不能被拷贝构造。这种情况可能会发生在以下两种情况下: 1)某个数据成员的拷贝构造函数是删除的或不可访问的(private),则这个类的合成拷贝构造函数会被编译器定义为 delete 。 2)在C++11中,我们可以使用 "= delete" 在函数参数列表后来定义一个删除的函数。当我们将拷贝构造函数定义为 "= delete",这意味着我们明确地告诉编译器不允许发生类对象之间的拷贝构造。这种方式可以实现类对象之间的非拷贝语义。 需要注意的是,如果一个类的拷贝构造函数被定义为 "= delete",则该类的对象不能被拷贝构造,任何尝试对该对象进行拷贝构造的操作都会导致编译错误。这在一些特定的应用场景下是很有用的,比如单例模式等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [c++11 =delete的使用](https://blog.csdn.net/qq_43247439/article/details/107313642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++11标准中的 deleted 函数](https://blog.csdn.net/weixin_41986518/article/details/87622907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值