iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11新特性“=default”,“=delete”怎么用
  • 561
分享到

C++11新特性“=default”,“=delete”怎么用

2023-06-15 04:06:55 561人浏览 独家记忆
摘要

这篇文章主要介绍了c++11新特性“=default”,“=delete”怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、 =default 和=delete 概述任

这篇文章主要介绍了c++11新特性“=default”,“=delete”怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

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所示:

#include<iOStream>using 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<<stu.getA()<<endl; //1cout<<stu.getB()<<endl; //2    Student stu1;           //编译失败,报错: no matching function for call to ‘Student::Student()'return 0;}

编译方式:g++ Student.cpp

编译报错,提示:Student.cpp: In function ‘int main(int, char**)':
Student.cpp:34:13: error: no matching function for call to ‘Student::Student()'
Student stu1;

例1定义了一个对象stu1,该对象将会使用Student类的无参构造函数,而该默认构造函数在Student类中,我们没有显式的说明。因此,c++编译器在我们提供了该函数实现之后是不会生成与之对应的默认函数版本的。在Student中我们重载了带2个参数的构造函数,但是无参的构造函数,没有提供,因此会报错。

解决方式是:在该类中显式的提供无参构造函数,如下:

#include<iostream>using namespace std;class Student{public:    Student(){}   //显式说明Student的无参构造函数    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<<stu.getA()<<endl; //1cout<<stu.getB()<<endl; //2    Student stu1;return 0;}

问题:以 Student(){} 这样的方式来声明无参数构造函数,会带来一个问题,就是使得 其不再是 POD 类型,因此可能让编译器失去对这样的数据类型的优化功能。这是我们不希望看到的。因此最好使用 = default来修饰默认构造函数。

#include<iostream>using namespace std;class Student{public:    Student() = default;    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<<stu.getA()<<endl; //1cout<<stu.getB()<<endl; //2    Student stu1;//使用is_pod模板类可以查看某类型是否属于POD类型,若为POD类型,则返回1,反之,返回0std::cout<<is_pod<Student>::value<<std::endl;  //1return 0;}

更多关于is_pod的用法请参考: std::is_pod 。

3、 使用“=delete”来限制函数生成

C++开发中,我们经常需要控制某些函数的生成。在C++11之前,我们经常的普遍做法是将其声明为类的 private 成员函数,这样若在类外这些这些函数的操作时候,编译器便会报错,从而达到效果。如例2:

#include<iostream>using namespace std;class Student{public:    Student() = default;    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:    Student(const Student& );    Student& operator =(const Student& );private:int m_a;int m_b;};int main(int argc,char **argv){Student stu(1,2);cout<<stu.getA()<<endl; //1cout<<stu.getB()<<endl; //2//Student stu1(stu);//报错:Student.cpp:26:5: error: ‘Student::Student(const Student&)' is private//Student stu1(3,4);//stu1 = stu;//报错:Student.cpp:27:14: error: ‘Student& Student::operator=(const Student&)' is privatestd::cout<<is_pod<Student>::value<<std::endl;  //return 0;}

例2代码编译报错,因为在类中,我们将Student的拷贝构造函数和拷贝赋值函数都声明为了 private 属性,因此,当在类外使用拷贝构造和拷贝赋值操作值,编译器会报错。虽然能够达到效果,但是不够直观和简洁。对于追求高效以及简洁来说,这样做有2个问题:

(1)不是最简化;
(2)对于友元支持不友好.

更为简洁直观的方法是使用:=delete

#include<iostream>using namespace std;class Student{public:    Student() = default;    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;}    Student(const Student& ) = delete;    Student& operator =(const Student& ) = delete;private:int m_a;int m_b;};int main(int argc,char **argv){Student stu(1,2);cout<<stu.getA()<<endl; //1cout<<stu.getB()<<endl; //2//Student stu1(stu);//报错:Student.cpp:39:21: error: use of deleted function ‘Student::Student(const Student&)'//Student(const Student& );//Student stu1(3,4);//stu1 = stu;//报错:SStudent.cpp:44:10: error: use of deleted function ‘Student& Student::operator=(const Student&)'std::cout<<is_pod<Student>::value<<std::endl;  //return 0;}

注:若缺省版本被删除了,重载该函数是非法的.

4、 “=default”使用范围

"=default"不仅仅局限于类的定义内,也可以用于类的定义外来修饰成员函数,如例3:#include<iostream>using namespace std;class Student{public:    Student() = default;    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;}    Student(const Student& ) = delete;    Student& operator=(const Student& );private:int m_a;int m_b;}; Student& Student::operator =(const Student& ) = delete;int main(int argc,char **argv){Student stu(1,2);cout<<stu.getA()<<endl; //1cout<<stu.getB()<<endl; //2Student stu1(3,4);    stu1 = stu;//编译报错:Student.cpp:42:10: error: use of deleted function ‘Student& Student::operator=(const Student&)'std::cout<<is_pod<Student>::value<<std::endl;  //return 0;}

感谢你能够认真阅读完这篇文章,希望小编分享的“C++11新特性“=default”,“=delete”怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网其他教程频道,更多相关知识等着你来学习!

--结束END--

本文标题: C++11新特性“=default”,“=delete”怎么用

本文链接: https://www.lsjlt.com/news/277763.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++11新特性“=default”,“=delete”怎么用
    这篇文章主要介绍了C++11新特性“=default”,“=delete”怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、 =default 和=delete 概述任...
    99+
    2023-06-15
  • C++11新特性“=default”,“=delete”的使用
    1、 =default 和=delete 概述 任何事物的出现都必然有着其出现的理由,伴随着每一个新的概念产生都会带来一系列的便利和价值。C++在不断的演变与发展,与此同时,伴随着...
    99+
    2022-11-12
  • C++11中新特性“=default”,“=delete”如何使用
    小编给大家分享一下C++11中新特性“=default”,“=delete”如何使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、 =default 和=de...
    99+
    2023-06-15
  • C++11新特性是什么
    本篇内容主要讲解“C++11新特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11新特性是什么”吧!什么是C++11C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正...
    99+
    2023-06-17
  • C++11有什么新特性
    这篇文章主要介绍“C++11有什么新特性”,在日常操作中,相信很多人在C++11有什么新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11有什么新特性”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-16
  • C++11、C++14、C++17、C++20常用新特性
    目录C++11C++14C++17C++20C++11 自动类型推断(auto关键字):C++11引入了auto关键字,可以根据变量初始值自动推导出变量类型。例如: auto i =...
    99+
    2023-03-10
    C++11 C++14 C++17 C++20 新特性
  • C#11新特性使用案例详解
    目录前言新特性之原始字符串使用案例原始字符串使用需要注意的地方什么情况下需要超过三个双引号开头尾引号和尾引号前面的换行符不包括在最终内容中结尾的三个引号不另起一行行不行和内插字符一起...
    99+
    2022-11-13
  • C#11新特性预览及使用介绍
    目录C# 11 预览:允许在内插字符串的“插值表达式”中换行C# 11 预览:列表模式C# 11 预览:新的参数空值检查如何尝试预览特性.NET 首席项目经理...
    99+
    2022-11-13
  • C++11、C++14、C++17、C++20常用新特性有哪些
    这篇文章主要介绍“C++11、C++14、C++17、C++20常用新特性有哪些”,在日常操作中,相信很多人在C++11、C++14、C++17、C++20常用新特性有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-07-05
  • C++的新特性shared_ptr怎么用
    本篇内容主要讲解“C++的新特性shared_ptr怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++的新特性shared_ptr怎么用”吧!代码示例首先是头文件:和之前介绍的例子相比,...
    99+
    2023-06-19
  • C++11中怎么将=default用于拷贝控制成员
    这篇文章主要介绍“C++11中怎么将=default用于拷贝控制成员”,在日常操作中,相信很多人在C++11中怎么将=default用于拷贝控制成员问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11中怎...
    99+
    2023-06-19
  • C++11新特性之列表初始化的具体使用
    目录统一的初始化方法列表初始化的一些使用细节初始化列表1、任何长度的初始化列表2、std::initialzer-list的使用细节列表初始化防止类型收窄在我们实际编程中,我们经常会...
    99+
    2022-11-13
  • C++11新特性之右值引用与完美转发详解
    目录一、左值与右值二、左值引用与右值引用三、右值引用应用1.移动构造与移动赋值1.模拟实现的string2.移动构造3.移动赋值四、默认移动构造和移动赋值重载函数五、完美转发1.万能...
    99+
    2022-11-13
  • C++11新特性中如何进行列表初始化的具体使用
    这篇文章给大家介绍C++11新特性中如何进行列表初始化的具体使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们...
    99+
    2023-06-29
  • Vue3.0新特性怎么使用
    本篇内容主要讲解“Vue3.0新特性怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3.0新特性怎么使用”吧!1、Vue3带来的新变化性能提升(零成本:从vue2切到vue3就享受到...
    99+
    2023-06-29
  • es6新特性怎么使用
    这篇“es6新特性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es6新特性怎么使用”文章吧。es6新特性有:1、l...
    99+
    2023-07-04
  • Java8新特性怎么使用
    本篇内容介绍了“Java8新特性怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java语言新特性Lambda表达式Lambda表达式...
    99+
    2023-06-02
  • iOS9中collectionView新特性怎么用
    这篇文章主要为大家展示了“iOS9中collectionView新特性怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS9中collectionView新特性怎么用”这篇文章吧。具体用法...
    99+
    2023-06-17
  • HTML5的新特性怎么使用
    这篇“HTML5的新特性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“HTML5的...
    99+
    2022-10-19
  • 怎么使用的新Java特性
    这篇文章主要讲解了“怎么使用的新Java特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用的新Java特性”吧!1 Try-with-resource 语句使用 try-catch ...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作