广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中 ‘=default ’及‘ =delete ’的使用
  • 372
分享到

C++中 ‘=default ’及‘ =delete ’的使用

2024-04-02 19:04:59 372人浏览 薄情痞子
摘要

目录1 =default2 =delete前言: c++的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符。如果实际编码时没有显示定义,那么编译

前言:

c++的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符。如果实际编码时没有显示定义,那么编译器将会默认生成这四类成员函数。使用=default=delete可以控制编译器默认函数体的使用。

1 =default

C++11新增了=default标识,编译器看到后,会生成默认的执行效率更高的函数定义体,同时会减轻编码时的工作量。当然,这里会引入一个问题,既然编译器会默认生成构造函数,那么=default的优势在哪里呢?回答这个问题之前,先看下这段代码


class Test{
public:
    Test(int a):x(a){};
private:
    int x;
};
int main ()
{
  Test test;
  return 0;
}


众所周知,上面这段是编译不过的,原因是因为在Test类中我们自己定义了一个构造函数,编译器看到后就不会再生成默认构造函数给我们,如果要解决这个编译问题的话需要我们提供一个没有参数的构造函数。

如:


 Test(){};


在类中加了上面的代码之后,编译器就会编译通过,但是在试想一下,如果这个类很大,且需要我们在类中初始化的成员很多呢?这个时候我们需要提供的这个默认构造函数就变得的很庞大,浪费我们很多时间进行变量的初始化,写一堆没有技术的赋值或者其它初始化语句。同样,拷贝构造函数和拷贝赋值函数也是一样。

=default就给我们提供了这样一个功能,加上之后,编译器就会给我们默认生成函数体,减轻工作量。

上面的类就这可以这些写:


class Test{
public:
    Test(int a):x(a){};
    Test()=default;
private:
    int x;
};


当然,=default不但可以在类成员内部添加也可以在类之外添加,但是使用=default时,必须遵守一个准则:default 函数特性只能用于类的特殊成员函数或者函数没有默认参数。 =default

写在类之外的方式如下:


class Test{
public:
    Test(int a):x(a){};
    Test()=default;
    Test(const Test& ts);
    Test& operator = (const Test& ts);
private:
    int x;
};
Test::Test(const Test& ts) =default;
Test& Test::operator = (const Test& ts) =default;


上面的代码中演示了=default在类成员外部使用的场景。但是类中确没有析构函数,编码时,如果涉及到类的继承和派生,尤其是通过基类指针指向了派生类对象,当调用delete删除派生对象时,如果基类没有显示定义析构函数,编译器会为基类默认生成析构函数,基类对象会被正常释放,但是也会产生一个问题,派生类没有正确释放,可能会产生内存泄露等问题。正确解决这种问题的做法是在基类中显示定义一个虚析构函数。这种方法在C++11之前是我们解决这种问题经常使用的,但是C++11之后,可以使用=default ,从而减轻我们的编码量,且编译器生成的代码效率更高。

代码如下所示:


class Base{
public:
    virtual ~Base()=default;
private:
    int x;
};
class A : public Base{
private:
    int y;
};
int main ()
{
  Base *pBase = new A;
  delete pBase;
  return 0;
}


2 =delete

C++11之前,delete是和new配对使用的,释放程序在堆上开辟得空间,将资源返还给操作系统,C++11之后,delete又多了一个含义既:禁用成员函数的使用。使用方法为:在函数名称后面加上=delete。

下面代码定义了一个类,类里面定义了一个整型的成员变量,在main函数中使用时,创建了两个类的实例,一个传入参数用整型一个用浮点型,

代码如下:


class Test { 
public: 
    Test()=delete;
    Test(int a):x(a) {std::cout<<x<<std::endl;} 
private:
    int x;
}; 
int main() { 
    Test test1(1); 
    Test test2(1.1);  
    return 0; 
} 


如上,这段代码是可以编译通过的,因为这段代码在编译时发生了隐式转换,将浮点型数据转成了整型,代价是损失了精度。代码运行后输出的结果都是:1。

如果不想在传入非整型的数据时编译通过,就可以使用=delete来抑制这种问题的产生。如使用=delete解决上面的问题,

代码如下:


class Test { 
public: 
    Test(int a):x(a) {std::cout<<x<<std::endl;} 
    Test(double)=delete;
private:
    int x;
}; 
int main() { 
    Test test1(1); 
    Test test2(1.1);  
    return 0;


编译时报错信息为:


main.cpp:23:19: error: use of deleted function ‘Test::Test(double)'
   23 |     Test test2(1.1);
      |                   ^
main.cpp:17:5: note: declared here
   17 |     Test(double)=delete;
      |     ^~~~


如上可知,使用=delete后,可以使我们禁用一些不需要编译器生成的默认函数,还可以避免因为数据类型原因导致的错误的函数调用。

到此这篇关于C++中 =default 及 =delete 使用的文章就介绍到这了,更多相关C++中 =default 和 =delete 使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++中 ‘=default ’及‘ =delete ’的使用

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

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

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

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

下载Word文档
猜你喜欢
  • C++中 ‘=default ’及‘ =delete ’的使用
    目录1 =default2 =delete前言: C++的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符。如果实际编码时没有显示定义,那么编译...
    99+
    2022-11-12
  • C++中 ‘=default ’及‘ =delete ’如何使用
    这篇文章主要介绍“C++中 ‘=default ’及‘ =delete ’如何使用”,在日常操作中,相信很多人在C++中 ‘=default ’及‘ =delete&nb...
    99+
    2023-06-22
  • 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新特性“=default”,“=delete”怎么用
    这篇文章主要介绍了C++11新特性“=default”,“=delete”怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、 =default 和=delete 概述任...
    99+
    2023-06-15
  • C++11中的default函数使用
    对于C++ 11标准中支持的default函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量。 C++的类有四类特殊成员函数...
    99+
    2022-11-12
  • C++中delete如何使用
    这篇文章将为大家详细讲解有关C++中delete如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。new用法: 开辟单变量地址空间1)new int; //开辟一个存放数组的存储空间,返...
    99+
    2023-06-17
  • C++中delete函数的具体使用
    在C++中delete函数用于回收new分配的内存空间。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间...
    99+
    2023-03-09
    C++ delete函数 C++ delete
  • c++中new和delete怎么使用
    在C++中,new和delete是用来动态分配和释放内存的操作符。1. 使用new操作符动态分配内存:```int* p = new...
    99+
    2023-09-27
    c++
  • C++中delete函数如何使用
    本篇内容主要讲解“C++中delete函数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中delete函数如何使用”吧!在C++中delete函数用于回收new分配的内存空间。C+...
    99+
    2023-07-05
  • C# 中default关键字如何使用
    本篇文章给大家分享的是有关C# 中default关键字如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C# default关键字可在switch语句或泛型代码中使用。sw...
    99+
    2023-06-17
  • c语言中default语句如何使用
    在C语言中,default语句用于switch语句中的默认情况。当没有任何一个case匹配时,会执行default语句块中的代码。 ...
    99+
    2023-10-28
    c语言
  • c++中的new和delete怎么用
    小编给大家分享一下c++中的new和delete怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!new expressionnew一个类型,会创建一个该类型的...
    99+
    2023-06-22
  • C++11中=delete的用法是什么
    本篇文章为大家展示了C++11中=delete的用法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++11中,当我们定义一个类的成员函数时,如果后面使用"=delete"...
    99+
    2023-06-29
  • C++的new和delete使用示例详解
    目录1. new 和 delete 三种 new2. operator new 和 operator delete3. 重载 operator new 和 operator...
    99+
    2022-12-08
    C++ new和delete使用 C++ new delete
  • C++超详细探究new/delete的使用
    目录内存管理new/delete1.new运算符的使用2.new的函数方法的使用3.定位newnew/delete/malloc/free区别内存管理 在C++中,一个可执行程序的虚...
    99+
    2022-11-13
  • 浅谈C++11中=delete的巧妙用法
    目录巧妙用法总结C++11中,当我们定义一个类的成员函数时,如果后面使用"=delete"去修饰,那么就表示这个函数被定义为deleted,也就意味着这个成员函数...
    99+
    2022-11-13
  • C++中new和delete匹配使用过程详解
    目录一、new和delete的使用二、operator new和operator delete函数三、new和delete的实现原理四、申请空间和释放空间应配套使用五、定位new表达...
    99+
    2023-02-14
    C++ new与delete C++ new与delete的使用
  • MySQL 中 Delete 使用
    一、关于 MySQL 中 Delete 使用 1.1 Delete 简介 Delete 是 SQL 中用于删除表格中记录的命令。通过使用 Delete 命令,您可以删除表格中的一行或多行记录,并将它们从表格中删除。在执行 Dele...
    99+
    2023-09-04
    数据库 mysql sql
  • 详解MySQL中default的使用
    NULL 和 NOT NULL 修饰符、DEFAULT 修饰符,AUTO_INCREMENT 修饰符。 NULL 和 NOT NULL 修饰符 可以在每个字段后面都加上这 NULL 或 NOT NULL 修...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作