• 【C++】运算符重载 ⑩ ( 下标 [] 运算符重载 | 函数原型 int& operator[](int i) | 完整代码示例 )






    一、下标 [] 运算符重载




    1、数组类回顾


    在之前的博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 , 实现了一个数组类 , 在一个类中 , 封装了一个 int 类型的指针 , 该指针指向堆内存的 内存空间 , 用于存放一个数组 ;

    核心是 2 2 2 个成员变量 , 记录指向堆内存的指针 , 和 数组长度 ;

    private:
    	// 数组长度
    	int m_length;
    
    	// 指向数组数据内存 的指针
    	int* m_space;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    数组都可以使用下标进行访问 , 如果要使用下标访问 自定义 Array 类对象 , 需要重载 [] 下标运算符 ;


    下面基于 博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 的代码 , 重载 数组下标 [] 操作符 ;


    2、下标 [] 运算符重载


    使用 成员函数 实现 下标 [] 运算符重载 :

    • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
      • 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ;
      • 函数名是 operate[] ;
    operate[]
    
    • 1
    • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
      • 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ,
      • 左操作数 : 其中 左操作数 是 a ,
      • 右操作数 : 运算符里面还有一个 int 类型的索引值 , 是右操作数 ;
      • 如果是成员函数 , 则将重载函数写在 左操作数 中 , 在 重载操作数的 成员函数中 this 指针就是 左操作数 ;
      • 此时只需要额外指定一个 int 类型右操作数 即可 ;
    operator[](int i)
    
    • 1
    • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
      • 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ;
      • a[i] 除了获取值之外 , 还要可以设置值 ;
      • a[i] 既可以作为左值 , 又要可以作为右值使用 ;
      • 因此返回值必须是 int 值本身 , 如果返回 int 值就只是一个副本值 没有意义 , 这里返回 int& 引用类型 ;
    int& operator[](int i)
    
    • 1
    • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
    // 数组下标 [] 操作符重载
    int& Array::operator[](int i)
    {
    	return m_space[i];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在测试类中 , 使用数组下标为数组设置值 , 并使用数组下标操作符获取数组元素的值 ;

    	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;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15




    二、完整代码示例




    1、Array.h 数组头文件


    #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);
    
    private:
    	// 数组长度
    	int m_length;
    
    	// 指向数组数据内存 的指针
    	int* m_space;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    2、Array.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];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    3、Test.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 = array;
    
    	// 打印 array2 数组值
    	for (int i = 0; i < array2.length(); i++)
    	{
    		//cout << array2.getData(i) << endl;
    		cout << array2[i] << endl;
    	}
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    4、执行结果


    执行结果 :

     调用有参构造函数
    5
    6
    7
     调用拷贝构造函数
    5
    6
    7
    请按任意键继续. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

  • 相关阅读:
    Android音视频开发:MediaCodec解码视频,得到YUV值,一帧一帧加载到SD卡中保存
    如何利用ChatGPT进行论文撰写?
    基于stm32单片机的信号发生器设计
    如何快捷地查看H.265视频播放器EasyPlayer的API属性及其使用方法?
    【终端】记录mbedtls库的重新安装
    Linux如何正确安装MySQL(详细步骤)
    uniapp移动端实现上拉加载(分页),下拉刷新
    2023年中国半导体缺陷检测设备市场规模及发展趋势分析[图]
    Python基础:【习题系列】函数
    redis的淘汰机制分析
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133634808