c++ 构造,析构,拷贝,移动构造函数

文章目录

  • 概述
    • 1.构造函数
    • 2. 拷贝构造函数
    • 3.移动构造函数
    • 4.析构函数
  • 例子
    • QT
    • UE4/5 c++
  • 小结

概述

对于c++来说,最基础的是类。对于一个类来说,主要由以下函数构成。如下:

  1. 构造函数
  2. 拷贝构造函数
  3. 移动构造函数
  4. 析构函数

当然,还有一个操作符拷贝赋值运算符;这个是由类的操作造成的。具体,来看看。

1.构造函数

构造函数用于在创建对象时初始化对象。它与类名相同,没有返回类型,也不能被声明为const、volatile或static。

class MyClass {
public:MyClass() //可以写初始化列表{//初始化代码}
};

2. 拷贝构造函数

拷贝构造函数用于通过复制现有对象的值来初始化新对象。它接受一个与类类型相同的常量引用作为参数。

class MyClass {
public:MyClass(const MyClass& other) {}
};

3.移动构造函数

移动构造函数用于通过转移资源(如动态内存)的所有权来初始化新对象,而不是复制。它接受一个右值引用作为参数。

class MyClass {
public:MyClass(MyClass&& other) noexcept {//转移other的资源}
};

4.析构函数

析构函数:析构函数用于在对象生命周期结束时执行清理操作。它与构造函数名称相同,但前面有两个~符号,没有参数、返回类型或异常抛出。

class MyClass {
public:~MyClass() {}
};

例子

接下来来个完整的例子,如下代码:

class MyClass {
private:int* data;
public:MyClass(size_t size) : data(new int[size]) { //初始化列表// 初始化data}~MyClass() {delete[] data;}// 拷贝构造函数MyClass(const MyClass& other) : data(new int[other.size()]) {std::copy(other.data, other.data + other.size(), data);}// 移动构造函数MyClass(MyClass&& other) noexcept : data(other.data) {other.data = nullptr;}// 拷贝赋值运算符MyClass& operator=(const MyClass& other) {if (this != &other) {delete[] data;data = new int[other.size()];std::copy(other.data, other.data + other.size(), data);}return *this;}// 移动赋值运算符MyClass& operator=(MyClass&& other) noexcept {if (this != &other) {delete[] data;data = other.data;other.data = nullptr;}return *this;}
};

QT

看下这个,是不是跟我们平常看到的类都很类似呢!当然,没有使用模板。关于模板的问题,以后有空了再写。先看如下源码吧,比如qtMainwindow这个类,

QMainWindow
explicit这个关键字之前写过了,有兴趣去看看。这个是构造,析构函数,再来看看其他的,
拷贝构造函数
宏定义
delete这个关键字之前也写了。有兴趣去看看之前的文章。这个就是禁止使用拷贝构造函数;因为拷贝构造函数使用的时候回用到拷贝赋值操作符,所以拷贝赋值操作符也禁止了。这个也是一个知识点,可以自己记下,以后写自己的lib库的时候,可以借鉴下。
QString
补充下,QString这个类,构造,析构,拷贝构造,移动构造都在这。

UE4/5 c++

移动构造函数
再来看个移动构造函数的例子。这个是ue里的,PimplPtr.h中的TPimplPtr noncopy的类。移动构造函数底层代码用的比较多。学习了这些内容,看到一些底层类的时候,才会更清楚。

再来看下UE里的FString,如下图:
在这里插入图片描述
可以跟上边QT里边的string类比较着看。

小结

本篇先写了c++构造,析构,拷贝,移动构造函数的概念,然后又写了各自的例子;再接着用qt代码的例子和ue代码的例子分别说明这些函数的使用。有兴趣,可以一起学习学习。
毕竟,有了基础,才能更好的前行。
OK,翻篇。

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

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

相关文章

【简历】郑州某二本学院:JAVA实习简历指导,基本没有面试机会

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这份简历是一个25届二本同学找JAVA实习的简历,从整体来看,简历版式没有问题,非常清晰。 但是内容特…

动态规划题解

文章目录 1、题汇总2、关键字3、思路4、总结 1、题汇总 1.1、最大字段和 dp[i] nums[i] max(dp[i - 1], 0) 1.2、买卖股票最佳时机_只买卖一次 &多次 1.3、股票最多两次 & 最多K次 & 含冷冻期 & 有手续费 1.101、按摩师_隔天接订单 dp[i] max(dp[i - 1], …

数据操作10-15题(30 天 Pandas 挑战)

数据操作 1. 相关知识点1.12 分组与连表1.13 排名 2. 题目2.10 第N高的薪水2.11 第二高的薪水2.12 部门工资最高的员工2.13 分数排名2.14 删除重复的电子邮箱2.15 每个产品在不同商店的价格 1. 相关知识点 1.12 分组与连表 分组max_salaryemployee.groupby(departmentId)[sal…

搜索+动态规划

刷题刷题刷题刷题 ​​​​​​​​​​​​​​Forgery - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路: 需要两个数组,一个数组全部初始化为".",另一个数组输入数据,每碰到一个“.”就进行染色操作,将其周围的…

Java后端每日面试题(day3)

目录 Spring中Bean的作用域有哪些?Spring中Bean的生命周期Bean 是线程安全的吗?了解Spring Boot中的日志组件吗? Spring中Bean的作用域有哪些? Bean的作用域: singleton:单例,Spring中的bean默…

使用 express 搭建最基本服务器程序

在使用 Express.js 框架搭建 web 应用时,通常会设置一个文件夹来存放静态资源,如图片、JavaScript 文件、CSS 文件等。默认情况下,这个文件夹经常被命名为 public。 安装 Express 如果你还没有安装 Express,可以通过 npm 来安装…

已经安装deveco-studio-4.1.3.500的基础上安装deveco-studio-3.1.0.501

目录标题 1、执行exe文件后安装即可2、双击devecostudio64_3.1.0.501.exe2.1、安装Note (注意和4.1的Note放不同目录)2.2、安装ohpm (注意和4.1版本的ohpm放不同目录)2.3、安装SDK (注意和4.1版本的SDK放不同目录) 1、执行exe文件后安装即可 2、双击devecostudio64_3.1.0.501.e…

JLMPack:您的高效文件管理利器

在信息爆炸的时代,文件管理已经成为我们日常工作中不可或缺的一部分。面对日益增长的数据量,如何高效地存储、管理和保护文件,成为每个人都需要面对的问题。为此,我们隆重推出JLMPack——一款强大而高效的文件管理工具&#xff0c…

Ubuntu 22.04.4 LTS 安装 php apache LAMP 环境nginx

1 安装php-fpm apt update apt-get install php-fpm #配置php-fpm服务启动 systemctl enable php8.1-fpm systemctl start php8.1-fpm #查看服务 systemctl status php8.1-fpm #查看版本 rootiZbp1g7fmjea77vsqc5hmmZ:~# php -v PHP 8.1.2-1ubuntu2.18 (cli) (built: J…

HTML内容爬取:使用Objective-C进行网页数据提取

网页爬取简介 网页爬取,通常被称为网络爬虫或爬虫,是一种自动浏览网页并提取所需数据的技术。这些数据可以是文本、图片、链接或任何网页上的元素。爬虫通常遵循一定的规则,访问网页,解析页面内容,并存储所需信息。 …

揭秘社会工程学:信息安全的无形杀手

前言 在当今数字化和高度互联的世界中,信息安全不仅仅依赖于技术防御措施,如防火墙、加密和防病毒软件等。随着技术的进步,攻击者的手段也在不断进化,社会工程学(Social Engineering)作为一种基于人类心理…

网安实验大全

一、网络拓扑环境搭建 网安实验一网络拓扑环境的搭建-CSDN博客 二、PGP 网络安全PGP加解密签名实验_pgp加密和解密过程-CSDN博客 三、CA部署 网络安全 基于Windows系统部署CA_构建基于windows的ca系统-CSDN博客 四、扫描工具 网络安全实验 网络扫描工具的使用_攻击机端…

mars3d加载wms服务或者wmts服务注意事项

1.wms只支持4326、3857、4490的标准切片,其他坐标系不支持 Mars3D三维可视化平台 | 火星科技 2.wmts同理,Mars3D三维可视化平台 | 火星科技 3.对应级别tilematrix找到的瓦片tilerow&tilecol这两个参数使用常见报错无效参考: 【Mars3d】…

护航端侧大模型平稳健康发展,百度大模型内容安全Lite版正式发布

6月28日,WAVE SUMMIT深度学习开发者大会 2024 “智变应用、码动产业”平行论坛在北京召开。与会,百度大模型内容安全Lite版正式发布,可面向低算力和超低算力的终端大模型提供离线场景下的一站式安全解决方案,为各类终端大模型平稳…

国际工业巨头遭勒索,亚信安全《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件94起,事件数量有小幅下降。从整体上看,Lockbit3.0仍然是影响最严重的勒索家族;本周RansomHub是影响最严重的勒索家族;Akira和Dragonforce恶意家族紧随其后,需要注意防范。拉…

Java中的单点登录(SSO)解决方案

Java中的单点登录(SSO)解决方案 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 什么是单点登录(SSO)&#…

ython 使用 cx_Freeze 打包,不想要打包文件中能直接看到依赖的代码,如何处理

背景:因为使用 cx_Freeze 打包时,添加需要依赖的文件 cx_Freeze 是一个用于将 Python 程序打包成独立可执行文件的工具,支持多个平台。当你需要打包包含多个 .py 文件的项目时,你可以通过编写一个 setup.py 文件来指定哪些模块应…

Java中的CountDownLatch原理使用注意事项

CountDownLatch是Java并发工具包java.util.concurrent中的一个类,主要用于解决一个或多个线程等待一组操作完成的问题。它的核心原理是基于一个内部的计数器,当计数器的值减至0时,所有因调用await()方法而阻塞的线程将会被唤醒,从…

MySQL 主从复制中 MHA 工具的研究与实践

MySQL 主从复制中 MHA 工具的研究与实践 一、MHA 工具简介二、MHA 的工作原理三、MHA 配置步骤环境准备1. 在主服务器上配置主从复制2. 在从服务器上配置复制 安装 MHA 工具1. 安装必要的依赖包2. 下载并安装 MHA 配置 MHA1. 创建 MHA 配置文件2. 配置 SSH 免密登录 测试 MHA1.…

vue-router 源码分析——8.重定向

这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行: 按官网的使用文档顺序,围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码,更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升,甚至面试时…