文章目录
- [一、数组类 等号 = 运算符重载](#一、数组类 等号 = 运算符重载)
 - 
- 1、数组类回顾
 - [2、等号 = 运算符重载](#2、等号 = 运算符重载)
 
 - 二、完整代码示例
 - 
- [1、Array.h 数组头文件](#1、Array.h 数组头文件)
 - [2、Array.cpp 数组实现类](#2、Array.cpp 数组实现类)
 - [3、Test.cpp 测试类](#3、Test.cpp 测试类)
 - 4、执行结果
 
 
一、数组类 等号 = 运算符重载
1、数组类回顾
数组类 定义后 ,
如果 想要 使用 一个已存在的数组类对象 为 另外一个已存在的数组类对象 赋值 ,
就需要 重载 等号 = 运算符 ;
重载 等号 = 运算符 , 需要满足如下条件 :
- 赋值功能 : 基本赋值功能 ;
 - 深拷贝 : 拷贝赋值 需要是 深拷贝 ;
 - 返回引用类型 : 等号运算 是 右结合 的 , 
a = b = c代码 , 先执行b = c, 然后再执行a = (b = c), 可见 等号运算符 的返回值 也要是一个相同类型的对象 , 该对象必须是引用类型 , 否则返回的是一个匿名对象 ; 
2、等号 = 运算符重载
使用 成员函数 实现 等号 = 运算符重载 :
- 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
- 要对 Array a 对象 , 使用 = 运算符 , 使用时用法为 a = a1 ;
 - 函数名是 
operate=; 
 
            
            
              cpp
              
              
            
          
          operate=
        - 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
- 要对 Array a 对象 , 使用 = 运算符 , 使用时用法为 a = a1 ;
 - 左操作数 : 其中 左操作数 是 Array a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
 - 右操作数 : 右操作数 是 Array a1 ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
 - 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
 
 
            
            
              cpp
              
              
            
          
          operator=(Array& a)
        - 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
- 等号运算 是 右结合 的 , 
a = b = c代码 , 先执行b = c, 然后再执行a = (b = c), 可见 等号运算符 的返回值 也要是一个相同类型的对象 , 该对象必须是引用类型 , 否则返回的是一个匿名对象 ; 
 - 等号运算 是 右结合 的 , 
 
            
            
              cpp
              
              
            
          
          Array& operator=(Array& a)
        - 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
- 先释放本身的内存空间 ;
 - 再根据右操作数 ( 参数 ) 数据重新进行内存分配 , 并赋值 ;
 - 最后 , 返回自身引用 ;
 
 
            
            
              cpp
              
              
            
          
          // 等号 = 操作符重载
Array& Array::operator=(Array& a)
{
	if (this->m_space != NULL)
	{
		// 释放 new int[m_length] 分配的内存 
		delete[] this->m_space;
		this->m_space = NULL;
	}
	// 设置数组长度
	this->m_length = a.m_length;
	// 创建数组
	this->m_space = new int[m_length];
	// 为数组赋值
	for (int i = 0; i < m_length; i++)
	{
		this->m_space[i] = a.m_space[i];
	}
	cout << " 调用 等号 = 操作符重载 函数" << endl;
	// 返回是引用类型
	// 返回引用就是返回本身
	// 将 this 指针解引用, 即可获取数组本身
	return *this;
}
        二、完整代码示例
1、Array.h 数组头文件
            
            
              cpp
              
              
            
          
          #pragma once
#include "iostream"
using namespace std;
class Array
{
public:
	// 无参构造函数
	Array();
	// 有参构造函数
	Array(int len);
	// 拷贝构造函数
	Array(const Array& array);
	// 析构函数
	~Array();
public:
	// 设置数组数据
	void setData(int index, int value);
	// 获取数组数据
	int getData(int index);
	// 获取数组长度
	int length();
public:
	// 数组下标 [] 操作符重载
	int& operator[](int i);
	// 等号 = 操作符重载
	Array& operator=(Array& a);
private:
	// 数组长度
	int m_length;
	// 指向数组数据内存 的指针
	int* m_space;
};
        2、Array.cpp 数组实现类
            
            
              cpp
              
              
            
          
          #include "Array.h"
// 无参构造函数
Array::Array()
{
	// 设置数组长度
	m_length = 10;
	// 为数组在堆内存中分配内存
	m_space = new int[m_length];
	cout << " 调用无参构造函数 " << endl;
}
// 有参构造函数
Array::Array(int len)
{
	// 设置数组长度
	m_length = len;
	// 为数组在堆内存中分配内存
	m_space = new int[m_length];
	cout << " 调用有参构造函数 " << endl;
}
// 拷贝构造函数
// 这是一个深拷贝 拷贝构造函数
Array::Array(const Array& array)
{
	// 设置数组长度
	m_length = array.m_length;
	// 创建数组
	m_space = new int[m_length];
	// 为数组赋值
	for (int i = 0; i < m_length; i++)
	{
		m_space[i] = array.m_space[i];
	}
	cout << " 调用拷贝构造函数 " << endl;
}
// 析构函数
Array::~Array()
{
	if (m_space != NULL)
	{
		// 释放 new int[m_length] 分配的内存 
		delete[] m_space;
		m_space = NULL;
	}
	cout << " 调用析构函数 " << endl;
}
// 设置数组数据
void Array::setData(int index, int value)
{
	m_space[index] = value;
}
// 获取数组数据
int Array::getData(int index)
{
	return m_space[index];
}
// 获取数组长度
int Array::length()
{
	return m_length;
}
// 数组下标 [] 操作符重载
int& Array::operator[](int i)
{
	return m_space[i];
}
// 等号 = 操作符重载
Array& Array::operator=(Array& a)
{
	if (this->m_space != NULL)
	{
		// 释放 new int[m_length] 分配的内存 
		delete[] this->m_space;
		this->m_space = NULL;
	}
	// 设置数组长度
	this->m_length = a.m_length;
	// 创建数组
	this->m_space = new int[m_length];
	// 为数组赋值
	for (int i = 0; i < m_length; i++)
	{
		this->m_space[i] = a.m_space[i];
	}
	cout << " 调用 等号 = 操作符重载 函数" << endl;
	// 返回是引用类型
	// 返回引用就是返回本身
	// 将 this 指针解引用, 即可获取数组本身
	return *this;
}
        3、Test.cpp 测试类
            
            
              cpp
              
              
            
          
          #include "iostream"
using namespace std;
#include "Array.h"
int main() {
	Array array(3);
	// 设置 array 数组值
	for (int i = 0; i < array.length(); i++)
	{
		//array.setData(i, i + 5);
		array[i] = i + 5;
	}
	// 打印 array 数组值
	for (int i = 0; i < array.length(); i++)
	{
		//cout << array.getData(i) << endl;
		cout << array[i] << endl;
	}
	// 使用拷贝构造函数 赋值
	Array array2(3);
	Array array3(3);
	// 调用重载的等号运算符
	array3 = array2 = array;
	// 打印 array2 数组值
	for (int i = 0; i < array3.length(); i++)
	{
		//cout << array3.getData(i) << endl;
		cout << array3[i] << endl;
	}
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}
        4、执行结果
执行结果 :
            
            
              cpp
              
              
            
          
           调用有参构造函数
5
6
7
 调用有参构造函数
 调用有参构造函数
 调用 等号 = 操作符重载 函数
 调用 等号 = 操作符重载 函数
5
6
7
Press any key to continue . . .
        