C++ 重载 [] 运算符

server/2024/10/18 19:27:56/

刚开始我是震惊的!

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

从学步开始

曾因会使用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/server/21042.html

相关文章

MAC有没有免费NTFS tuxera激活码 tuxera破解 tuxera for mac2023序列号直装版 ntfs formac教程

Tuxera NTFS 2023破解版是一款非常好用的在线磁盘读写工具&#xff0c;该软件允许mac用户在Windows NTFS格式的硬盘上进行读写操作&#xff0c;Mac的文件系统是HFS&#xff0c;而Windows则使用NTFS格式&#xff0c;这导致在Mac系统上不能直接读写Windows格式的硬盘。然而&#…

spark3.0.0单机模式安装

注&#xff1a;此安装教程基于hadoop3集群版本 下载安装包 下载spark3.0.0版本&#xff0c;hadoop和spark版本要对应&#xff0c;否则会不兼容 用xftp上传Linux虚拟机&#xff0c;上传目录/bigdata&#xff08;可修改&#xff09; 解压 tar -zxvf /bigdata/spark-3.0.0-bin-h…

Android retrofit使用模板

1&#xff0c;加入网络访问权限 <uses-permission android:name"android.permission.INTERNET" /> 2,引入依赖 implementation "com.google.code.gson:gson:2.8.5" implementation "com.squareup.retrofit2:retrofit:2.9.0" implementatio…

android 内部序列化对象

在Android中&#xff0c;内部序列化对象通常指的是将对象的状态转换为字节流&#xff0c;以便可以将对象保存到文件、通过网络发送&#xff0c;或者在应用的不同部分之间传递。在Java中&#xff0c;序列化是通过实现java.io.Serializable接口来完成的。Android继承了Java的序列…

.NET 检测地址/主机/域名是否正常

&#x1f331;PING 地址/主机名/域名 /// <summary>/// PING/// </summary>/// <param name"ip">ip</param>/// <returns></returns>public static bool PingIp(string ip){System.Net.NetworkInformation.Ping p new System.N…

深入学习@TableField注解:MyBatis-Plus中的字段映射技术解析

深入学习TableField注解&#xff1a;MyBatis-Plus中的字段映射技术解析 一、 介绍1、TableField注解的作用2、TableField注解的属性3、实际应用场景4、注意事项5、示例代码6、结论 一、 介绍 在基于Java的持久化框架中&#xff0c;实体类的字段映射到数据库表的列是一个基本操…

企业工厂如何逆风翻盘:VR全景打破多重桎梏

现阶段&#xff0c;制造业工厂面临的困境&#xff0c;就是用着上百万的设备&#xff0c;却赚着几毛钱的利润。传统的工厂参观方式也存在着很多的局限性&#xff0c;例如时间上不方便、不能实地参访、生产线具有隐患等&#xff0c;都会使得参观者不能深入地了解工厂的生产环境和…

【数据库】Redis

文章目录 [toc]Redis终端操作进入Redis终端Redis服务测试切换仓库 String命令存储字符串普通存储设置存储过期时间批量存储 查询字符串查询单条批量查询 Key命令查询key查询所有根据key首字母查询判断key是否存在查询指定的key对应的value的类型 删除键值对 Hash命令存储hash查…