C++ 重载 [] 运算符

news/2024/9/23 8:29:27/

刚开始我是震惊的!

我从未想过[]下居然有逻辑!

从接触程序设计语言开始

曾因会使用a[0]访问数组元素而沾沾自喜

曾认为[] ,理应是访问数组的一种方式

曾认为[]只是一个无情的标识!

所以

当我们写下a[0]时,究竟是为了什么?


是为了找到a[0]对应的值

那么如何能找到它对应的值?


首先要找到它对应的地址

这样只是能读取

如何能修改其值?(a[0]=5)


当然是返回左值引用

重载[]运算符有何应用场景?


可以像数组一样访问链表类

代码逻辑是怎样的?


index=0 指针不动 返回其数据域

index=1 指针指向下个节点 返回其数据域

如何确保指针不出界?


最后一个节点的指针域是nullptr 如果指针指向nullptr则表示到头了

是否应该考虑const重载?


应该!

#include <iostream>
#include <stdexcept>template <typename T>
class LinkedList
{
private:struct Node{T data;     // 存储的数据Node *next; // 指向下一个节点的指针Node(T val, Node *ptr = nullptr) : data(val), next(ptr) {}};Node *head; // 链表的头节点public:LinkedList() : head(nullptr) {}~LinkedList(){clear();}void add(T value){// 在链表末尾添加元素if (head == nullptr){head = new Node(value);}else{Node *temp = head;while (temp->next != nullptr){temp = temp->next;}temp->next = new Node(value);}}void clear(){// 清空链表,释放内存Node *current = head;while (current != nullptr){Node *next = current->next;delete current;current = next;}head = nullptr;}T &operator[](int index){// 重载[]运算符,以便可以使用索引访问元素Node *temp = head;int count = 0;while (temp != nullptr && count < index){temp = temp->next;++count;}if (temp == nullptr){throw std::out_of_range("Index out of range");}return temp->data; // 返回对应节点的数据引用}// 为了避免在const对象上使用[]运算符时出错,添加const版本的[]运算符const T &operator[](int index) const{Node *temp = head;int count = 0;while (temp != nullptr && count < index){temp = temp->next;++count;}if (temp == nullptr){throw std::out_of_range("Index out of range");}return temp->data;}
};int main()
{LinkedList<int> list;list.add(10);list.add(20);list.add(30);// 访问和修改元素std::cout << list[1] << std::endl; // 20list[1] = 50;std::cout << list[1] << std::endl; // 50// 异常处理try{list[3]; // 0 1 2 没有 3}catch (const std::out_of_range &e){std::cout << e.what() << std::endl;}return 0;
}


http://www.ppmy.cn/news/1455346.html

相关文章

[Unity常见小问题]打包ios后无法修改模型透明度

问题 在Editor下可以使用如下代码去修改模型的材质的透明度&#xff0c;但是打包ios后无法对透明度进行修改且没有任何warning和error using System.Collections; using System.Collections.Generic; using UnityEngine;public class NewBehaviourScript : MonoBehaviour {[R…

spss 数据分析 医学spss数据分析,数据预处理,Excel中选择多个输入框(或称为单元格)并输入相同数值

在Excel中选择多个输入框&#xff08;或称为单元格&#xff09;并输入相同数值&#xff0c;有几种方法可以实现&#xff1a; 在SPSS中进行数据分析时&#xff0c;数据的准确性和整洁性对于结果的有效性至关重要。因此&#xff0c;在将Excel数据导入SPSS之前&#xff0c;进行数…

浏览器跨域详解

一、什么是跨域 浏览器跨域是指当一个Web应用程序试图访问另一个协议、主机或端口不同的资源时&#xff0c;所发生的情况。这主要是由于浏览器的同源策略造成的&#xff0c;它是为了网站的安全而设置的安全限制&#xff0c;防止一个网站恶意访问另一个网站的资源。当然这是比较…

16_Scala面向对象编程_函数

文章目录 1.声明Scala函数2.访问伴生对象3.空对象直接用的方法4.构造对象--通过object获取单例对象--直接new--scala独有apply()方式--scala有参构造--scala构造方法两大类使用辅构造如下上述代码主构造为辅助构造方法甚至可以多个多个辅助构造形参内容不能重不使用辅助构造和使…

Elasticsearch初步认识

Elasticsearch初步认识 ES概述基本概念正向索引和倒排索引IK分词器ik_smart最少切分ik_max_word为最细粒度划分 ES索引库基本操作对索引库操作对文档操作 ES概述 Elasticsearch&#xff0c;简称为 ES&#xff0c;是一款非常强大的开源的高扩展的分布式全文检索引擎&#xff0c…

【48天笔试强训】day18

题目1 描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…

数塔问题(蛮力算法和动态规划)

题目&#xff1a;如下图是一个数塔&#xff0c;从顶部出发在每一个节点可以选择向左或者向右走&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使得路径上的数字之和最大&#xff0c;及路径情况。(使用蛮力算法和动态规划算法分别实现&#xff09; #include…

【C++】 认识多态 + 多态的构成条件详细讲解

前言 C 目录 1. 多态的概念2 多态的定义及实现2 .1 虚函数&#xff1a;2 .2 虚函数的重写&#xff1a;2 .2.1 虚函数重写的两个例外&#xff1a; 2 .3 多态的两个条件&#xff08;重点&#xff09;2 .4 析构函数为啥写成虚函数 3 新增的两个关键字3.1 final的使用&#xff1a;3…