C++中赋值运算符重载

一、赋值运算符重载概念

赋值运算符重载和拷贝构造函数一样,都是C++中6个默认成员函数之一。但是拷贝构造函数是用已存在对象去创建一个新对象,而赋值运算符重载是两个已存在的对象,对象1赋值给对象2。

当我们未显示定义赋值运算符重载时,编译器会自动生成默认的赋值运算符重载。该默认赋值重载运算符对于内置类型是直接赋值的,对于自定义类型会调用该自定义类型的赋值重载运算符。

赋值运算符重载不能重载为全局函数,因为如果重载为全局函数,那么类中一定没有显示定义赋值运算符重载,编译器会生成默认的赋值运算符重载,两个赋值运算符重载会发生冲突。

二、显式定义赋值运算符重载

由于赋值运算符可以进行连续赋值,所以需要返回被赋值的对象。如果返回值类型是Date,返回的不是被赋值的对象,而是该对象的拷贝,又需要调用拷贝构造函数,效率低。所以返回值类型为引用。

为了防止自己赋值给自己,需要加上一个判断 this != &d

//Date类赋值运算符重载
Date& operator=(const Date& d)
{
	if (this != &d)
	{
		this->_year = d._year;
		this->_month = d._month;
		this->_day = d._day;
	}
	return *this;
}

既然我们不显示定义赋值运算符重载,编译器会自动生成赋值运算符重载,那么为什么我们还要去显式定义呢?

原因和拷贝构造函数一样,编译器自动生成的赋值运算符重载只是以值的方式逐字节拷贝,如果成员变量中有指针变量,那么造成浅拷贝。因此当类中有动态内存申请时,我们需要显式定义赋值运算符重载。

最近更新

  1. TCP协议是安全的吗?

    2024-02-18 06:08:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-18 06:08:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-18 06:08:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-18 06:08:05       20 阅读

热门阅读

  1. SQL错误:42000

    2024-02-18 06:08:05       34 阅读
  2. 单反相机用sd卡还是cf卡?相机cf卡和sd卡区别

    2024-02-18 06:08:05       53 阅读
  3. rtt设备io框架面向对象学习-软件模拟rtc设备

    2024-02-18 06:08:05       37 阅读
  4. 排序算法部分总结

    2024-02-18 06:08:05       30 阅读
  5. 2024前端面试准备之HTML篇

    2024-02-18 06:08:05       30 阅读
  6. vue watch监听

    2024-02-18 06:08:05       38 阅读
  7. Vue路由

    Vue路由

    2024-02-18 06:08:05      28 阅读
  8. 防火墙HA详解

    2024-02-18 06:08:05       26 阅读
  9. 阿里云服务器安装MySQL、Apache、PHP

    2024-02-18 06:08:05       22 阅读