文章目录
- [一、下标 [] 运算符重载](#一、下标 [] 运算符重载)
-
- 1、数组类回顾
- [2、下标 [] 运算符重载](#2、下标 [] 运算符重载)
- 二、完整代码示例
-
- [1、Array.h 数组头文件](#1、Array.h 数组头文件)
- [2、Array.cpp 数组实现类](#2、Array.cpp 数组实现类)
- [3、Test.cpp 测试类](#3、Test.cpp 测试类)
- 4、执行结果
一、下标 [] 运算符重载
1、数组类回顾
在之前的博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 , 实现了一个数组类 , 在一个类中 , 封装了一个 int 类型的指针 , 该指针指向堆内存的 内存空间 , 用于存放一个数组 ;
核心是 2 2 2 个成员变量 , 记录指向堆内存的指针 , 和 数组长度 ;
cpp
private:
// 数组长度
int m_length;
// 指向数组数据内存 的指针
int* m_space;
数组都可以使用下标进行访问 , 如果要使用下标访问 自定义 Array 类对象 , 需要重载 [] 下标运算符 ;
下面基于 博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 的代码 , 重载 数组下标 [] 操作符 ;
2、下标 [] 运算符重载
使用 成员函数 实现 下标 [] 运算符重载 :
- 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
- 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ;
- 函数名是
operate[]
;
cpp
operate[]
- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
- 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ,
- 左操作数 : 其中 左操作数 是 a ,
- 右操作数 : 运算符里面还有一个 int 类型的索引值 , 是右操作数 ;
- 如果是成员函数 , 则将重载函数写在 左操作数 中 , 在 重载操作数的 成员函数中 this 指针就是 左操作数 ;
- 此时只需要额外指定一个 int 类型右操作数 即可 ;
cpp
operator[](int i)
- 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
- 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ;
- a[i] 除了获取值之外 , 还要可以设置值 ;
- a[i] 既可以作为左值 , 又要可以作为右值使用 ;
- 因此返回值必须是 int 值本身 , 如果返回 int 值就只是一个副本值 没有意义 , 这里返回 int& 引用类型 ;
cpp
int& operator[](int i)
- 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
cpp
// 数组下标 [] 操作符重载
int& Array::operator[](int i)
{
return m_space[i];
}
在测试类中 , 使用数组下标为数组设置值 , 并使用数组下标操作符获取数组元素的值 ;
cpp
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、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);
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];
}
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 = array;
// 打印 array2 数组值
for (int i = 0; i < array2.length(); i++)
{
//cout << array2.getData(i) << endl;
cout << array2[i] << endl;
}
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
4、执行结果
执行结果 :
cpp
调用有参构造函数
5
6
7
调用拷贝构造函数
5
6
7
请按任意键继续. . .