C++11中类与对象推出的新功能 [补充讲解final/override关键字]

news2024/10/5 17:22:15

文章目录

  • 1.移动构造
  • 2.移动赋值
    • 对于移动构造/移动赋值的想法
  • 3.类成员定义时初始化
  • 4.强制生成默认函数的关键字default
  • 5.禁止生成默认函数的关键字delete
    • 5.1介绍
    • 5.2应用场景
      • 1.法一:析构函数私有化
      • 2.法二: delete关键字
      • 思考
  • 6.final关键字
  • 7.override关键字

在这里插入图片描述

1.移动构造

在这里插入图片描述

编译器自动生成移动构造

在这里插入图片描述

编译器没有自动生成移动构造

在这里插入图片描述
在这里插入图片描述

2.移动赋值

规则同上

在这里插入图片描述

对于移动构造/移动赋值的想法

首先我们思考一下 一个什么样的类需要有移动构造?

回答:一个涉及到深层拷贝的类 因为移动构造的本意就是当遇到右值拷贝时直接交换不再进行深层拷贝

接着我们看为什么大佬这么设计移动构造自动生成的条件

相比之前的默认成员函数 编译器自动生成的移动构造/移动赋值 条件更为苛刻 其实 C++大佬这样设计是完全有道理的 当一个类不需要析构\拷贝构造\赋值重载时

一个不需要析构/拷贝构造\赋值重载的类[一个不需要自己实现析构函数的类 基本上也不需要自己实现拷贝构造和赋值重载] 我们大概可以想象他的成员是这样的:一个内置类型一个自定义类型

对于这样一个类 当我们没有自己实现移动构造 此时编译器会自动生成移动构造 自动生成的这个移动构造完全可以处理这个类的成员 [对于内置类型进行浅拷贝 对于自定义类型 有移动构造调用移动构造 没有调用拷贝构造]

内置类型本来浅拷贝就行 自定义类型如果自己实现移动构造[当前类需要自己实现 那就自己实现一个] 那就调用移动构造 如果没有自己实现 说明当前类不需要移动构造或满足条件自动生成的就够用

3.类成员定义时初始化

C++11允许在类定义时给成员变量缺省值,默认生成的构造函数会使用这些缺省值初始化

在这里插入图片描述

4.强制生成默认函数的关键字default

在这里插入图片描述
C++11让我们能更好的控制要使用的默认函数。假设我们要使用某个默认的函数,但是因为一些原因这个函数没有默认生成。比如:

  1. 自己实现了拷贝构造 就不会自动生成 默认拷贝构造/无参构造/移动构造了,那么我们可以使用default关键字显示指定他们生成。
  2. 自己实现了有参构造 就不会自动生成默认无参构造 那么我们可以使用default关键字显示指定他生成
class Person
{
public:
Person(const char* name = "", int age = 0)
:_name(name)
, _age(age)
{}
//自己实现了拷贝构造 不会再自动生成移动构造
Person(const Person& p)
:_name(p._name)
,_age(p._age)
{}
//强制移动构造生成
Person(Person&& p) = default;

private:
bit::string _name;
int _age;
};

int main()
{
Person s1;
Person s2 = s1;
Person s3 = std::move(s1);
return 0;
}

5.禁止生成默认函数的关键字delete

5.1介绍

如果我们自己与一个类 但是我们不想让别人调用我们这个类的拷贝构造 在C++98中我们可以将这个类的拷贝构造函数 访问属性设置为private 使得他人无法调用 在C++11中我们可以在该函数声明加上=delete,该语法指示编译器不生成对应函数的默认版本,称 =delete修饰的函数删除函数
在这里插入图片描述

5.2应用场景

实现一个类 使得这个类只能在堆上创建对象[一个类创建的对象销毁时自动调用析构函数 如果这个对象的析构函数只能在堆区调用 那么我们的目的就达到]

1.法一:析构函数私有化

在这里插入图片描述

2.法二: delete关键字

在这里插入图片描述

思考

为什么new的对象可以存在?

因为pre是个指针 是个内置类型 只有自定义类型的对象在销毁时才会自动调用析构 而内置类型不会 即析构函数能否调用 对内置类型无影响

但是此时又引发一个问题 析构函数无法被调用 如果此类有这样的成员属性char* _str; 那么这个类就有资源需要手动释放[本来应该自己实现一个析构函数] 怎么办?

废话不多说 直接上代码 一看便知

class HeapOnly
{
public:
	HeapOnly()
	{
		_str = new char[10];
	}

	~HeapOnly() = delete;

	void Destroy()
	{
		delete[] _str;

		operator delete(this);
		//free(this);
	}

private:
	char* _str;
};

int main()
{
	//堆上创建对象
	HeapOnly* ptr = new HeapOnly;

	//栈上创建对象
	HeapOnly hp1;
	//数据段上[静态区]创建对象
	static HeapOnly hp2;

	ptr->Destroy();
	//operator delete(ptr);
	//free(this);

	return 0;
}

在这里插入图片描述

6.final关键字

final:修饰父类虚函数,表示该虚函数不能再被重写
在这里插入图片描述

7.override关键字

override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lambda表达式(JAVA)

注:如果没有学过匿名内部类和接口不推荐往下看。 Lambda表达式的语法: (parameters) -> expression 或 (parameters) ->{ statements; } parameters:表示参数列表;->:可理解为“被用于”的意思&#xff1b…

苹果修复了旧款iPhone上的iOS内核零日漏洞

导语 近日,苹果发布了针对旧款iPhone和iPad的安全更新,回溯了一周前发布的补丁,解决了两个被攻击利用的零日漏洞。这些漏洞可能导致攻击者在受影响的设备上提升权限或执行任意代码。本文将介绍这些漏洞的修复情况以及苹果在修复漏洞方面的持续…

自定义类型:结构体,枚举,联合 (2)

2. 位段 位段的出现就是为了节省空间。 2.1 什么是位段 位段的声明和结构是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。 比如: struct A {int _a:2;int _b:5;int…

ArcGIS笔记5_生成栅格文件时保存报错怎么办

本文目录 前言Step 1 直接保存到指定文件夹会报错Step 2 先保存到默认位置再数据导出到指定文件夹 前言 有时生成栅格文件时,保存在自定义指定的文件夹内会提示出错,而保存到默认位置则没有问题。因此可以通过先保存到默认位置,再数据导出到…

Vite与Webpack谁更胜一筹,谁将引领下一代前端工具的发展

你知道Vite和Webpack吗?也许有不少“程序猿”对它们十分熟悉。 Webpack Webpack是一个JavaScript应用程序的静态模块打包工具,它会对整个应用程序进行依赖关系图构建。而这也会导致一个不可避免的情况,使用Webpack启动应用程序的服务器&…

GO-SLAM——论文简析

GO-SLAM 位姿估计效果很好,有高效的回环检测和 full BA(每个关键帧),适用于单目、双目和 RGB-D。 一、简介 消费级深度传感器容易产生噪声,这就导致 RGB-D SLAM 会丢失一些几何细节,导致过度平滑。使用轻…

ASP.NET framework升级core .NET 6.0

C# ASP.NET framework 升级core .NET 6.0 .NET 7.0 .NET 8.0 或者以上 using System.Web.Http; using HttpPostAttribute Microsoft.AspNetCore.Mvc.HttpPostAttribute; using RouteAttribute Microsoft.AspNetCore.Mvc.RouteAttribute; using HttpGetAttribute Mic…

c++初阶--内存管理

目录 c/c 内存分布c内存管理方式new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数new和delete的实现原理内置类型自定义类型 malloc/free和new/delete的区别内存泄露什么是内存泄漏,内存泄露的危害如何避免内存泄漏 在c语言中我…

数据结构 - 4(栈和队列6000字详解)

一:栈 1.1 栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原…

Go语言入门心法(三): 接口

Go语言入门心法(一) Go语言入门心法(二): 结构体 一:go语言接口认知 Go语言中接口认知升维:解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思维|系统化思维 面向对象编程(oop)三大特性: 封装,继承,多态 Go语言中,可以认为接口是一种自定义的抽…

【Pytorch】深度学习之优化器

文章目录 Pytorch提供的优化器所有优化器的基类Optimizer 实际操作实验参考资料 优化器 根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值,使得模型输出更加接近真实标签的工具 学习目标 Pytorch提供的优化器 优化器的库torch.opt…

uniapp打包配置

安卓: 首先不管是什么打包都需要证书,安卓的证书一般都是公司提供或者自己去申请。然后把包名等下图框住的信息填上,点击打包即可。 ios:ios需要使用mac到苹果开发者平台去申请证书,流程可以参考下边的链接 参考链接…

Ceph 中的写入放大

新钛云服已累计为您分享769篇技术干货 介绍 Ceph 是一个开源的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能。 Ceph 消除了对系统单一中心节点的依赖,实现了无中…

基于单片机的感应自动门系统

目录 摘 要......................................................................................................................... 3 第一章 绪论.............................................................................................................…

论文阅读:

来源:公众号看到一篇文章 原文:https://arxiv.org/pdf/2301.04275.pdf 代码:GitHub - fengluodb/LENet: LENet: Lightweight And Efficient LiDAR Semantic Segmentation Using Multi-Scale Convolution Attention 0、摘要 基于LiDAR的语义…

【LeetCode刷题(数据结构)】:二叉树的前序遍历

给你二叉树的根节点root 返回它节点值的前序遍历 示例1: 输入:root [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:root [1] 输出:[1] 示例…

计算机毕业设计 基于Java的敬老院管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

基于pid控制的小功率直流电机调速

摘 要 随着电子技术的高度发展 ,直流电机测控逐步从模拟化向数字化转变。完全由硬件电路实现的直流电机测控系统 ,电路复杂 ,调整困难且可靠性不高 ,缺乏控制的灵活性。在工业控制中 ,按偏差的比例P、积分I和微分D进行控制的PID调节器现在得到广泛的应用。在小型微型 计算机用…

LoRa模块的通信范围与其他无线通信技术的比较

在物联网(IoT)和远程传感应用中,选择合适的无线通信技术至关重要。LoRa(低功耗广域网)模块因其低功耗、远距离通信和广覆盖范围而备受关注。本文将探讨LoRa模块的通信范围,并与其他无线通信技术如Wi-Fi和蓝…

Leetcode刷题详解——盛最多水的容器

1.题目链接:盛最多水的容器 2.题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容…