当前位置: 首页 > article >正文

C++《类和对象中》:拷贝构造和赋值重载 + 运算符重载详解

在C++中,类和对象是面向对象编程的核心概念。本文将深入探讨类和对象中的拷贝构造函数、赋值运算符重载以及运算符重载的实现和应用。

拷贝构造函数

拷贝构造函数是一种特殊的构造函数,用于创建一个对象作为另一个同类型对象的副本。它在参数列表中只有一个参数,即一个对当前类类型的引用,并且该参数通常被声明为const

特点

  1. 构造函数的重载:拷贝构造函数是构造函数的一个重载版本。
  2. 参数要求:拷贝构造函数的参数必须是一个类类型对象的引用,且通常为const
  3. 自动调用:在需要通过值传递对象或返回对象时,编译器会自动调用拷贝构造函数。
  4. 默认行为:如果没有显式定义拷贝构造函数,编译器会生成一个默认的拷贝构造函数,对内置类型成员变量进行值拷贝,对自定义类型成员变量调用其拷贝构造函数。

实现示例

class Date {
public:
// 拷贝构造函数
// d2(d1)
  Date(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}
private:
    int _year;
    int _month;
    int _day;
};

赋值运算符重载

赋值运算符重载用于定义对象间赋值操作的行为。它是一个必须重载为成员函数的运算符,其参数为一个对当前类类型的const引用。

特点

  1. 成员函数:赋值运算符重载必须定义为成员函数。
  2. 参数和返回值:参数为const引用,返回值为当前类类型的引用,以支持连续赋值操作。
  3. 默认行为:如果没有显式实现,编译器会生成一个默认的赋值运算符重载,其行为类似于默认构造函数。

实现示例

class Date {
public:
    Date& operator=(const Date& d) {
        if (this != &d) {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }
        return *this;
    }
private:
    int _year;
    int _month;
    int _day;
};

运算符重载

运算符重载允许我们为类类型的对象定义或修改运算符的行为。运算符重载可以是成员函数或非成员函数。

特点

  1. 函数命名:运算符重载函数的命名规则为operator后跟运算符符号。
  2. 参数数量:一元运算符有一个参数,二元运算符有两个参数。
  3. 成员函数:如果运算符重载为成员函数,第一个参数(左侧操作数)由this指针隐式提供。
  4. 不能创建新的运算符:不能通过连接语法中没有的符号来创建新的操作符。

实现示例

class Date {
public:
    bool operator==(const Date& d) const {
        return _year == d._year && _month == d._month && _day == d._day;
    }
};

bool operator<(const Date& d1, const Date& d2) {
    if (d1._year < d2._year) return true;
    if (d1._year == d2._year) {
        if (d1._month < d2._month) return true;
        if (d1._month == d2._month) {
            return d1._day < d2._day;
        }
    }
    return false;
}

结论

通过拷贝构造函数和赋值运算符重载,我们可以控制对象的复制行为,而运算符重载则允许我们为自定义类型提供直观的操作符使用体验。这些特性是C++面向对象编程中不可或缺的部分,它们使得代码更加灵活和表达力强。


http://www.kler.cn/a/398407.html

相关文章:

  • MySQL-关联查询和子查询
  • 类与对象;
  • SpringBoot+React养老院管理系统 附带详细运行指导视频
  • 微服务即时通讯系统的实现(客户端)----(2)
  • ReactPress与WordPress:两大开源发布平台的对比与选择
  • 从零到一:利用 AI 开发 iOS App 《震感》的编程之旅
  • DimensionX 部署笔记
  • 关于mysql中的锁
  • 策略模式-策略模式在不同支付工具中的应用
  • 【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)
  • 悬浮窗,ViewPager2内嵌套RecyclerView,RecyclerView高度异常的问题分析
  • 学习threejs,使用第一视角控制器FirstPersonControls控制相机
  • GOOGLE EARTH ENGINE——利用GEE计算和下载雪的覆盖频率(SCF)和雪的消失日期(SDD)含全球除格陵兰岛外的矢量
  • 探索C++三大特性--C++ 继承详解:从概念到高级用法
  • 每日OJ题_牛客_NC114旋转字符串_C++_Java
  • STM32 | 空气净化器
  • 构建安全可靠的人工智能数据中心的关键因素
  • mac怎么看当前终端是zsh还是bash
  • 通过全球最前沿的技术解决视频拼接中时延带来的的应用缺陷,使得全景视频拼接能够真正得以大范围使用和推广的智慧地产开源了。
  • web前端开发--盒子属性
  • C++20中的概念(Concepts)到底是什么概念?
  • Android - Pixel 6a 手机OS 由 Android 15 降级到 Android 14 操作记录
  • 六:从五种架构风格推导出HTTP的REST架构
  • 2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调
  • 深度学习神经网络创新点方向(具体)
  • Linux——环境基础开发工具使用1