【C++】默认构造函数,参数化构造函数,拷贝构造函数,拷贝赋值运算符, 移动构造函数 ,移动赋值运算符

1. 默认构造函数 (Default Constructor)

作用: 无参创建对象
签名: ClassName()
特点:
①无参数或所有参数都有默认值
②若未声明任何构造函数,编译器自动生成(空实现)
③用于容器默认初始化(如 vector(5))
调用时机:

Student s1;          // 显式调用
Student* ps = new Student; // 动态分配

最佳实践:

class Student {
public:// 显式默认构造Student() = default;
};

2. 参数化构造函数 (Parameterized Constructor)

作用: 带参初始化对象
签名: ClassName(params)
特点:
①可带默认参数(Student(int age = 18))
②单参数构造函数可能引发隐式转换(用 explicit 禁止)
调用时机:

Student s("Alice");  // 直接调用
Student s = "Bob";   // 隐式转换(除非explicit)

最佳实践:

class Student {
public:explicit Student(std::string name) : name_(std::move(name)) {}
};

3. 拷贝构造函数 (Copy Constructor)

作用: 复制同类型对象
签名: ClassName(const ClassName& other)
特点:
①处理深拷贝(资源复制)
②编译器默认生成浅拷贝版本
③按值传参/返回时会调用
调用时机:

Student s1;
Student s2 = s1;   // 拷贝构造
Student s3(s1);    // 直接调用

最佳实践:

class Student {
public:Student(const Student& other) : name_(other.name_), age_(other.age_) {std::cout << "拷贝构造\n";}
};

4. 拷贝赋值运算符 (Copy Assignment Operator)

作用: 对象间赋值
签名: ClassName& operator=(const ClassName& other)
特点:
①处理已存在对象的赋值
②必须处理自赋值和资源释放
③返回 *this 支持链式赋值
调用时机:

Student s1, s2;
s1 = s2;  // 拷贝赋值

最佳实践:

class Student {
public:Student& operator=(const Student& other) {if (this != &other) {  // 检查自赋值name_ = other.name_;age_ = other.age_;}return *this;}
};

5. 移动构造函数 (Move Constructor)

作用: 高效转移资源所有权
签名: ClassName(ClassName&& other) noexcept
特点:
①C++11 引入,提升性能
②"窃取"源对象资源(如指针)
③应将源对象置于有效但可析构状态
调用时机:

Student createStudent();
Student s1 = createStudent(); // 移动构造(返回值优化)
Student s2 = std::move(s1);   // 显式移动

最佳实践:

class Student {
public:Student(Student&& other) noexcept : name_(std::move(other.name_)), age_(std::exchange(other.age_, 0)) {std::cout << "移动构造\n";}
};

6. 移动赋值运算符 (Move Assignment Operator)

作用: 转移资源到已存在对象
签名: ClassName& operator=(ClassName&& other) noexcept
特点:
①高效转移资源,避免深拷贝
②必须处理自赋值
③标记 noexcept(影响容器操作)
调用时机:

Student s1;
s1 = Student("临时"); // 移动赋值
s1 = std::move(s2);   // 显式移动赋值

最佳实践:

class Student {
public:Student& operator=(Student&& other) noexcept {if (this != &other) {name_ = std::move(other.name_);age_ = std::exchange(other.age_, 0);}return *this;}
};

完整示例代码

#include <iostream>
#include <string>
#include <utility>class Student {std::string name_;int age_ = 0;
public:// 1. 默认构造函数Student() = default;// 2. 参数化构造函数explicit Student(std::string name, int age = 18): name_(std::move(name)), age_(age) {std::cout << "参数化构造: " << name_ << "\n";}// 3. 拷贝构造函数Student(const Student& other): name_(other.name_), age_(other.age_) {std::cout << "拷贝构造: " << name_ << "\n";}// 4. 拷贝赋值运算符Student& operator=(const Student& other) {if (this != &other) {name_ = other.name_;age_ = other.age_;std::cout << "拷贝赋值: " << name_ << "\n";}return *this;}// 5. 移动构造函数Student(Student&& other) noexcept: name_(std::move(other.name_)), age_(std::exchange(other.age_, 0)) {std::cout << "移动构造: " << name_ << "\n";}// 6. 移动赋值运算符Student& operator=(Student&& other) noexcept {if (this != &other) {name_ = std::move(other.name_);age_ = std::exchange(other.age_, 0);std::cout << "移动赋值: " << name_ << "\n";}return *this;}~Student() {std::cout << "析构: " << (name_.empty() ? "[已移动]" : name_) << "\n";}
};int main() {std::cout << "=== 默认构造 ===\n";Student s1;  // 默认构造std::cout << "\n=== 参数化构造 ===\n";Student s2("Alice", 20);  // 参数化构造std::cout << "\n=== 拷贝构造 ===\n";Student s3 = s2;  // 拷贝构造std::cout << "\n=== 拷贝赋值 ===\n";Student s4; s4 = s3;  // 拷贝赋值std::cout << "\n=== 移动构造 ===\n";Student s5 = std::move(s4);  // 移动构造std::cout << "\n=== 移动赋值 ===\n";Student s6;s6 = Student("Bob");  // 移动赋值std::cout << "\n=== 程序结束 ===\n";
}

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

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

相关文章

办公效率提升指南:完成重复任务自动化

手动操作容易出错&#xff0c;尤其是在处理大量数据或复杂文档时。它将PDF转换、Word处理、Excel操作、OCR识别等高频功能融为一体&#xff0c;界面清爽无冗余&#xff0c;零广告打扰&#xff0c;专注提升工作效率。它内置七大核心模块&#xff1a;自动任务、系统工具、文件处理…

数字炼金术:当API工作流遇见AI客服—点石成金的智能革命!

目录 引言 一、蓝耘元生代MaaS平台概述 1.1 蓝耘平台的API服务 1.2 蓝耘平台的优势 二、初识蓝耘元生代MaaS平台—带你深度体验 2.1 从零开始——平台注册与环境搭建 2.2 蓝耘平台的优势在哪里&#xff1f; 三、API工作流调用技巧与实践 3.1 API工作流设计与调用流程 …

HackMyVM-Uvalde

目录信息搜集漏洞利用权限提升信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.21.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-16 01:10 EDT Nmap scan report for dev.medusa.hmv (192.168.21.6) Host is up (0.00015s latency). MAC Addr…

「Java EE开发指南」如何使用MyEclipse中的Web Fragment项目?

开发者可以通过使用Web Fragment项目模块化应用程序部署描述符&#xff0c;本文提供如何使用它们的必要信息。 该特性在MyEclipse中可用。 MyEclipse v2025.1离线版下载 通过使用Web Fragment项目&#xff0c;您的Web应用程序部署描述符可以模块化&#xff0c;就像能够模块化…

redis的key过期删除策略和内存淘汰机制

一、key的过期删除策略 原由&#xff1a;一般情况下&#xff0c;在使用redis作缓存&#xff0c;对k设置过期时间&#xff0c;当过期时间到后&#xff0c;k还是占用内存的&#xff0c;并没有从内存中移除。 1.定时删除 在设置key的过期时间的同时&#xff0c;为该key创建一个定…

NVIDIA Nsight Deep Learning Designer使用

一、关于产品 1.1 产品介绍 NVIDIA Nsight Deep Learning Designer 是一款面向 AI 推理开发者的可视化建模与优化工具。它支持基于 ONNX 格式的神经网络模型编辑、结构可视化、性能分析与 TensorRT 引擎导出&#xff0c;帮助用户更高效地设计、调优和部署高性能推理模型。该工…

Android 常见100道面试题(完整版)

一、基础组件与核心原理Activity 相关Q1&#xff1a;请描述 Activity 的完整生命周期&#xff0c;从创建到销毁经历哪些关键方法&#xff1f;A&#xff1a;Activity 完整生命周期包括&#xff1a;onCreate&#xff08;初始化&#xff09;→ onStart&#xff08;可见&#xff09…

Navicat 为 SQLite 数据库设置密码指南

Navicat 为 SQLite 数据库设置密码指南 在 SQLite 中设置密码实际上是通过加密实现的&#xff0c;Navicat 使用 SQLCipher 扩展来提供数据库加密功能。以下是详细的操作方法和注意事项&#xff1a; 在 Navicat 中设置密码&#xff08;加密数据库&#xff09; 步骤 1&#xff1a…

Spring Framework:Java 开发的基石与 Spring 生态的起点

在 Java 技术领域&#xff0c;Spring Framework 无疑是一座里程碑式的存在。它不仅彻底改变了 Java 企业级应用的开发模式&#xff0c;更以其为核心衍生出了庞大的 Spring 生态系统&#xff0c;成为无数开发者构建应用的首选技术栈。本文将以 Spring Framework 为核心&#xff…

Unity中 terriaria草,在摄像机拉远的时候就看不见了,该怎么解决

在 Unity 中&#xff0c;当摄像机拉远时草就看不见&#xff0c;可能是由于地形细节距离设置、摄像机裁剪平面设置或 LOD&#xff08;Level of Detail&#xff09;设置不当导致的。以下是具体的解决方法&#xff1a;调整地形细节距离&#xff1a;选中场景中的地形对象&#xff0…

驱动开发系列63 - 编译 NVIDIA 的 open-gpu-kernel-modules 开源内核驱动及搭建调试环境

目录 一:通过apt方式安装nvidia 驱动 二:通过 .run 方式安装nvidia驱动 三:编译安装nvidia开源内核驱动 四:验证和调试 五:卸载驱动 1. 以apt方式安装nvidia 驱动的卸载方法 2. 以.run方式安装nvidia驱动的卸载方法 六:安装CUDA环境 一:通过apt方式安装nvidia 驱动…

Rocky Linux 9.2:从 /home 分区释放 10G 空间扩容到 / 根分区

在日常运维中&#xff0c;常见的问题之一就是安装的软件过多&#xff0c;导致根分区&#xff08;/&#xff09;空间不足&#xff0c;而其他分区&#xff08;例如 /home&#xff09;却有大量闲置空间。本文将演示如何在 Rocky Linux 9.2 上&#xff0c;通过 LVM&#xff08;Logi…

iis/iis express无需手动配置handlers,仅将 DLL 放入bin目录即可处理 HTTP 请求的功能

以下是使用VB.NET实现的方案&#xff0c;分别针对传统ASP.NET&#xff08;System.Web&#xff09;和ASP.NET Core 两种环境&#xff0c;实现无需手动配置handlers&#xff0c;仅将 DLL 放入bin目录即可处理 HTTP 请求的功能。 一、传统ASP.NET&#xff08;System.Web&#xff…

【DP】单词的划分

题目描述 有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析&#xff0c;需要将它划分成若干个部分&#xff0c;每个部分称为一个单词。出于减少分析量的目的&#xff0c;我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。 输入 第一行&#xff0c…

UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts)

要在 UniApp 中使用 tui-xecharts插件&#xff08;或类似图表库如 uCharts&#xff09;&#xff0c;需遵循以下步骤。以下流程以 ​​uCharts​​&#xff08;官方推荐的高性能跨平台图表库&#xff09;为例&#xff0c;因其在 UniApp 生态中更成熟且文档完善。若需使用 tui-xe…

顺序表 —— OJ题

在上一篇文章中简单介绍了顺序表&#xff0c;这一篇文章讲解下一个比较经典的题&#xff1a;杨辉三角先看一下什么是杨辉三角下面解释&#xff1a;大概就是这个规律。而 ta 其实就是二维数组 即&#xff1a;0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1然后看一下这个题的要求…

基于单片机的防酒驾系统设计

一、引言1.1 研究背景与意义随着社会经济的快速发展&#xff0c;汽车保有量持续攀升&#xff0c;道路交通安全问题愈发凸显。酒后驾驶作为交通事故的主要诱因之一&#xff0c;严重威胁着人们的生命财产安全。据统计&#xff0c;全球每年因酒驾造成的交通事故死亡人数高达数十万…

Redis面试精讲 Day 22:Redis布隆过滤器应用场景

【Redis面试精讲 Day 22】Redis布隆过滤器应用场景 在高并发、大数据量的互联网系统中&#xff0c;如何高效判断一个元素是否存在于集合中&#xff0c;是缓存设计中的关键问题。尤其是在面对缓存穿透——即恶意或无效请求频繁查询不存在的数据&#xff0c;导致数据库压力剧增—…

Spark Shuffle中的数据结构

文章目录1.Shuffle中的三种数据结构2.AppendOnlyMap原理2.1 聚合2.2 扩容2.3 排序2.4 为什么是数组&#xff1f;3.ExternalAppendOnlyMap原理3.1 工作原理3.2 AppendOnlyMap大小估计3.2.1 为什么要估计大小&#xff1f;3.2.2 估计大小浅析3.2.2.1 什么时候采样&#xff1f;3.2.…

告别在线转换风险:本地运行的PDF转Word技术评测

Word文档&#xff08;.docx&#xff09;是可编辑的主流办公格式&#xff0c;支持灵活修改文字、排版、图片、表格等。它的体积仅有5.5M&#xff0c;小巧不占空间&#xff0c;且转换不限文件大小&#xff0c;随用随转&#xff0c;毫无限制。初次使用需完成一次安装&#xff0c;之…