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.mfbz.cn/a/764313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

做测试/爬虫 selenium 元素定位 谷歌浏览器 插件推荐,提高元素定位效率

注:插件均在谷歌应用商店 下载 1.XPath Helper 插件 作用:用于Html中对目标字段或者属性值进行匹配 快捷启动:ctrl shift x 示例图如下: 2. ChroPath 插件 作用: 提高元素定位效率 启动:谷歌浏览器 按 F12 -&g…

Query Rewriting for Retrieval-Augmented Large Language Models

文章目录 题目摘要方法实验 题目 检索增强大语言模型的查询重写 论文地址:https://arxiv.org/abs/2305.14283 项目地址:https://github.com/xbmxb/RAG-query-rewriting 摘要 大语言模型(LLM)在检索--然后阅读(retriev…

使用 Amazon Bedrock Converse API 简化大语言模型交互

本文将介绍如何使用 Amazon Bedrock 最新推出的 Converse API,来简化与各种大型语言模型的交互。该 API 提供了一致的接口,可以无缝调用各种大型模型,从而消除了需要自己编写复杂辅助功能函数的重复性工作。文中示例将展示它相比于以前针对每…

「ETL趋势」分区支持PostgreSQL、Greenplum、Gauss200, 定时任务支持Kettle

FineDataLink作为一款市场上的顶尖ETL工具,集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具,进行了新的维护迭代。本文把FDL4.1.9最新功能作了介绍,方便大家对比:(产品更新详情:…

学习记录之数学表达式(6)

目录 十二、图与网络12.1 有向图12.2 元组与对象12.3 二元关系与有向图12.4 无向图12.5 有向网络12.6 作业 十三、树13.1 例子13.2 定义13.3 Java代码13.4 作业 十四、 m \mathbf{m} m叉树14.1 预备知识:字符串14.2 m \mathbf{m} m-叉树的定义14.3 Java代码14.4 作…

mysql-sql-第十三周

学习目标: sql 学习内容: 37.查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>60,中等为:70-80,优良为:80-90,优秀…

2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文

2024 年江西省研究生数学建模竞赛题目交通信号灯管理 1 题目 交通信号灯是指挥车辆通行的重要标志,由红灯、绿灯、 黄灯组成。红灯停、绿灯行,而黄灯则起到警示作用。交通 信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。 一…

OpenSSH漏洞扫描(CVE-2024-6387、CVE-2006-5051、CVE-2008-4109)

目录 POC:ssh_poc.py 使用方法 github CVE-2024-6387 漏洞信息 补丁 POC:ssh_poc.py import sys import socket import argparse import threading import queue import os from datetime import datetime from urllib.parse import urlparse from…

LinuxRT启动Veristand项目的配置文件

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

FreeRTOS的任务理论

文章目录 2 FreeRTOS的任务理论2.1 任务及任务优先级2.2 任务状态理论2.2.1 任务状态的转换2.2.2 任务状态改变相关函数2.2.3 调度器相关函数 2.3 FreeRTOS延时2.3.1 vTaskDelay延时2.3.2 vTaskDelayUntil延时2.3.3 pdMS_TO_TICKS(x)宏 2.4 TCB任务控制块…

kafka 实现精确一次性语义实践总结

文章目录 前言幂等生产者幂等生产者的工作原理幂等生产者的局限性如何使用幂等生产者 事务事务的应用场景事务可以解决哪些问题事务是如何保证精确一次性的使用事物 API事物的工作原理 事务的性能 前言 Kafka的精确一次性语义与国际象棋正好相反:要理解它不容易&am…

怎么分区,新买的电脑只有一个C盘

C盘在大多数默认情况下是一台电脑的系统盘,也是创建硬盘分区时,最先被创建的盘。不过在一些特殊情况下,电脑上只有一个C盘。 为什么会出现只有一个C盘这种情况?当我们发现电脑只有一个C盘时,能通过哪些方法去创建其他硬…

Redis 7.x 系列【8】数据类型之哈希(Hash)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 HSET2.2 HGET2.3 HDEL2.4 HEXISTS2.5 HGETALL2.6 HKEYS2.7 HLE…

SMS多表面同步透镜设计

SMS多表面同步透镜设计 一、设计原理 1、Snell定律的矢量形式 折射定律又称Snell定律,主要包括两个方面:一是入射光线、法线和折射光线共面,二是入射角和折射角满足以下关系: n 1 s i n θ 1 n 2 s i n θ 2 n_1 sin{\theta_1…

arm-linux-gnueabihf-gcc:Command not found 解决办法

问题描述 使用虚拟机交叉编译程序,当使用了sudo去编译, 出现arm-linux-gnueabihf-gcc:Command not found的问题。明明已经安装并配置好环境了,发现还是提示找不到编译器。 原因分析: 特意去查了一下sudo方法,我们在sud…

linux中的进程以及进程管理

程序和进程的区别和联系 程序(Program): 程序是一组指令的集合,通常存储在磁盘或其他存储设备上,是一种静态的概念。程序本身并没有运行,它只是一个可执行的文件或脚本,包含了一系列的指令和数…

Listary:文件搜索,一键即达

名人说:莫道谗言如浪深,莫言迁客似沙沉。 ——刘禹锡《浪淘沙》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、软件介绍1、Listary2、核心功能 二、下载安装1、下载2、安装 三、使用方…

mysql8.0.19安装zip版本

下载地址https://downloads.mysql.com/archives/community/ 下载版本 下载后解压,不包括data 和my.ini文件。其中data 文件是自动生成的【mysqld --initialize --console】,my.ini需要自己编写设置。 新建my.ini文件 需要自己设置 basedirG:\soft\mysql…

Hubstudio指纹浏览器:海外代理IP新选择,IPXProxy为何备受推崇?

许多人都会把Hubstudio指纹浏览器和代理IP进行搭配使用,为了保证网络操作的顺利进行,例如亚马逊的多账号管理。那有没有好用的海外代理IP呢,如何在Hubstudio指纹浏览器中使用代理IP呢? 下面就给大家推荐好用的一家海外IP代理&…

【linux】网络基础(2)——udp协议

文章目录 引言udp协议的特点udp的头部结构UDP的工作原理简单的UDP网络程序套接字的认识udp服务端代码udp客户端代码服务端运行 引言 用户数据报协议(User Datagram Protocol, UDP)是一种无连接的传输层协议。它是因特网协议家族的一部分,定义…
最新文章