当前位置:   article > 正文

【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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/613115
推荐阅读
相关标签
  

闽ICP备14008679号