【C/C++】C++类的六个特殊成员函数,附亲测实例

在C++中,类的特殊成员函数是指那些由编译器自动生成的函数,它们在特定情况下会被调用,以支持类的某些操作。这些特殊成员函数包括:

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

    • 当没有提供任何构造函数时,编译器会自动生成一个默认构造函数。
    • 它不接受任何参数,或者所有参数都有默认值。
    • 如果类中定义了其他构造函数,编译器不会自动生成默认构造函数。
  2. 复制构造函数(Copy Constructor)

    • 当一个对象作为另一个对象的副本时,编译器会调用复制构造函数。
    • 它接受一个同类型的对象的引用作为参数。
    • 如果类中定义了复制构造函数,编译器不会自动生成默认的复制构造函数。
  3. 赋值运算符(Assignment Operator)

    • 当使用赋值操作符(=)将一个对象赋值给另一个对象时,编译器会调用赋值运算符。
    • 它接受一个同类型的对象的引用作为参数。
    • 如果类中定义了赋值运算符,编译器不会自动生成默认的赋值运算符。
  4. 移动构造函数(Move Constructor)

    • 当一个对象通过移动语义(使用右值引用)被创建时,编译器会调用移动构造函数。
    • 它接受一个右值引用作为参数。
    • 如果类中定义了移动构造函数,编译器不会自动生成默认的移动构造函数。
  5. 移动赋值运算符(Move Assignment Operator)

    • 当一个对象通过移动语义被赋值时,编译器会调用移动赋值运算符。
    • 它接受一个右值引用作为参数。
    • 如果类中定义了移动赋值运算符,编译器不会自动生成默认的移动赋值运算符。
  6. 析构函数(Destructor)

    • 当对象生命周期结束时,编译器会调用析构函数。
    • 它没有参数,也不返回任何值。
    • 如果类中定义了析构函数,编译器不会自动生成默认的析构函数。

这些特殊成员函数对于类的正确使用至关重要,因为它们确保了类的资源管理(如内存分配和释放)能够正确执行。在设计类时,应该根据类的需要来决定是否需要自定义这些特殊成员函数。如果类中包含动态分配的资源(如指针、文件句柄等),通常需要自定义析构函数来释放这些资源,以避免内存泄漏。同样,如果类需要支持复制或移动操作,也应该提供相应的特殊成员函数。

#include <iostream>class MyClass {
public:// 默认构造函数MyClass() {std::cout << "Default constructor called." << std::endl;}// 复制构造函数MyClass(const MyClass& other) {std::cout << "Copy constructor called." << std::endl;// 深拷贝或浅拷贝逻辑if (other.m_ptr) {auto n = std::strlen(other.m_ptr) + 1;m_ptr = new char[n];std::memcpy(m_ptr, other.m_ptr, n);}}// 赋值运算符MyClass& operator=(const MyClass& other) {std::cout << "Co				py assignment operator called." << std::endl;// 赋值逻辑if (this != &other)delete[] m_ptr; // 释放已经存在的资源if(other.m_ptr != nullptr{auto n = std::strlen(other.m_ptr) + 1;m_ptr = new char[n];std::memcpy(m_ptr, other.m_ptr, n);}return *this;	}// 移动构造函数 -- 新建对象,不需要constMyClass(MyClass&& other) noexcept {std::cout << "Move constructor called." << std::endl;// 移动逻辑if (other.m_ptr) m_ptr = std::move(other.m_ptr)other.m_ptr = nullptr;}// 移动赋值运算符 -- 对已有的对象进行赋值,不需要constMyClass& operator=(MyClass&& other) noexcept {std::cout << "Move assignment operator called." << std::endl;// 移动赋值逻辑if (this != &other) {delete[] m_ptr; //释放已存在的资源}if (other.mtr)m_ptr = std::move(other.m_ptr);other.m_ptr = nullptr;return *this;}// 析构函数~MyClass() {std::cout << "Destructor called." << std::endl;if (m_ptr)delete[] m_ptr;}
private:char *m_ptr;
};int main() {// 使用默认构造函数创建对象MyClass obj1;// 使用复制构造函数创建对象MyClass obj2(obj1);// 使用赋值运算符MyClass obj3;obj3 = obj2;// 使用移动构造函数创建对象MyClass obj4(std::move(obj1));// 使用移动赋值运算符MyClass obj5;obj5 = std::move(obj4);return 0;
}

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

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

相关文章

【C++】C++程序的四个区和智能指针的实现

这篇文章介绍下 C 程序的四个区&#xff0c;以及一个智能指针的简单实现。 起因 最近在公司审查代码的时候&#xff0c;coverity 对以下代码&#xff1a; T fun() {Obj obj;//代码逻辑 }报出了 obj 占用空间过大&#xff0c;有可能栈溢出的问题。 以前从来没有考虑过C的代码…

双指针练习:盛水最多的容器

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

【多模态】34、LLaVA-v1.5 | 微软开源,用极简框架来实现高效的多模态 LMM 模型

文章目录 一、背景二、方法2.1 提升点2.2 训练样本 三、效果3.1 整体效果对比3.2 模型对于 zero-shot 形式的指令的结果生成能力3.3 模型对于 zero-shot 多语言的能力3.4 限制 四、训练4.1 数据4.2 超参 五、代码 论文&#xff1a;Improved Baselines with Visual Instruction …

深入了解 Java 泛型

Java 泛型&#xff08;Generics&#xff09;是 Java SE 5 引入的一个强大特性&#xff0c;它允许你定义类、接口和方法时使用类型参数&#xff0c;从而使代码更加灵活和可重用。本篇博客将详细讲解 Java 泛型的概念、使用方法和注意事项&#xff0c;并通过多个代码示例&#xf…

回溯算法指组合总和

题目&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 思路&#xff1a; 这种问题…

python编程:SQLite 管理图片数据库

在本博客中&#xff0c;我们将介绍如何使用 wxPython 和 sqlite3 模块构建一个 GUI 应用程序&#xff0c;该程序可以遍历指定文件夹中的所有图片&#xff0c;并将其信息存储到 SQLite 数据库中。 C:\pythoncode\new\InputImageOFFolderTOSqlite.py 项目简介 我们的目标是创建…

【无标题】2024.6.2

2024.6.2 【明霄升海平&#xff0c;飞彩镌流年。】 Sunday 四月廿六 A. 矩形覆盖 题目描述 有N个矩形&#xff0c;矩形的底边边长为1&#xff0c;且均在X轴上&#xff0c;高度给出&#xff0c;第i个矩形的高为h[i]&#xff0c;求最少需要几个矩形才能覆盖这个图形。 例如h […

微信里的东西怎么打印出来呢

随着微信的普及&#xff0c;我们的日常生活和工作都离不开这个强大的社交工具。无论是重要的工作文件、孩子的作业、还是精彩的旅行照片&#xff0c;我们都习惯在微信里保存和分享。但是&#xff0c;当需要将这些微信里的内容打印出来时&#xff0c;很多人可能会感到困惑和麻烦…

2024.05.18 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、实习 | 东风日产2024实习生招聘正式启动 实习 | 东风日产2024实习生招聘正式启动 2、实习 | 达实智能实习生招募令&#xff01; 实习 | 达实智能实习生招募令&#xff01; 3、校招 | …

电力能源指挥中心调度台解决方案主要关注的问题

调度台是指挥中心不可或缺的设备&#xff0c;随着信息化建设的不断深入&#xff0c;电力能源指挥中心已成为重要平台。因此&#xff0c;构建一套高效、智能的电力能源指挥中心调度台解决方案&#xff0c;需要关注以下关键问题&#xff1a; 一、实时监控与数据采集 电力能源指挥…

2.3.2_3 单链表的建立

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏&#xff0c;今后还会不断更新。 此外&#xff0c;《程序员必备技能》专栏和《程序员必备工具》专栏&#xff08;该专栏暂未开设&#xff09;日后会逐步更新&#xff0c;感兴趣的小伙伴可以点一下订阅、收藏、关注&#xff01; 谢…

【AI 大揭秘】ChatGPT 写作绝技与必备提示词大全

利用ChatGPT撰写文章是一种极具创意的方法&#xff0c;它能显著提升您的写作效率&#xff0c;并帮助您创作出高质量的内容。通过人工智能的辅助&#xff0c;您可以迅速、便捷地生成精美文章&#xff0c;或至少为您的下一个写作项目提供灵感。 不管您是在撰写文章、剧本还是电子…

react路由参数path不再支持正则?比较v5和v6写法的差异性

文章目录 前言v5方式&#xff1a;直接在path参数中&#xff0c;写入对应正则&#xff08;1&#xff09;代码详细注释如下&#xff08;2&#xff09;页面输出如下&#xff0c;会出现undefined的情况 v6方式: 在路由对象中配置&#xff0c;但只可配动态路由&#xff0c;不可用正则…

TH方程学习(4)

一、背景介绍 在本节将会对TH方程打包成一个函数&#xff0c;通过输入目标星的轨道要素&#xff0c;追踪星在目标星VVLH坐标系下的相对位置和速度&#xff0c;以及预报的时间&#xff0c;得到预报时刻追踪星在VVLH坐标系下的位置和速度&#xff0c;以及整个状态转移矩阵。 合并…

替换所有的问号 ---- 模拟

题目链接 题目: 分析: 我们只需要遍历字符串, 将所有?进行修改即可但是需要判断, 修改的字符不能和前面后面重复同时, 有一个细节需要处理, 就是当?在最前面时, 没有前面的符号需要判断 在最后面的时候, 没有后面的字符需要判断 代码: class Solution {public String mod…

Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

面试题--this关键字

this 指向是前端面试中的常问题型&#xff0c;简单分析为以下几种&#xff1a; 1. 在全局作用域中&#xff0c;this 关键字固定指向全局对象 window 或者 global。 2. 在函数作用域中&#xff0c;取决于函数是如何被调用的。 1&#xff09;函数直接调用&#xff0c;this 指向…

Leetcode 3169. Count Days Without Meetings

Leetcode 3169. Count Days Without Meetings 1. 解题思路2. 代码实现 题目链接&#xff1a;3169. Count Days Without Meetings 1. 解题思路 这一题的话我们只需要先对meeting的时间进行一下排序&#xff0c;然后不断更新当前连续开会的时间即可。当某一个会议开始时&#…

Java中lambda表达式是啥怎么使用

在Java中&#xff0c;Lambda表达式&#xff08;也称为闭包&#xff09;是一种简洁地表示匿名函数&#xff08;即没有名称的函数&#xff09;的方式。它们允许你将函数作为参数传递或赋值给变量&#xff0c;从而简化代码。Lambda表达式在Java 8及更高版本中引入。 Lambda表达式…

打造智能化未来:智能运维系统架构解析与应用实践

在数字化转型的大背景下&#xff0c;智能运维系统成为了企业提升效率、降低成本、增强安全性的关键利器。本文将深入探讨智能运维系统的技术架构&#xff0c;介绍其核心要素和应用实践&#xff0c;帮助读者全面了解智能运维系统的概念、优势和应用价值。 ### 1. 智能运维系统的…