C++进阶之操作符重载函数operator[]:用法实例(四百三十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者

博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列原创干货持续更新中...... 】🚀
Android多媒体专栏地址:多媒体系统工程师系列原创干货持续更新中...... 】🚀
推荐1:车载系统实战课地址:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
推荐2:HIDL与AIDL实战课地址:Android14 Binder之HIDL与AIDL通信实战课 🚀
推荐3:Android15音效实战课地址:Android15快速自定义与集成音效实战课 🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
更多原创,欢迎关注:Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

      • [🌻1. 前言](#🌻1. 前言)
      • [🌻2. C++操作符重载函数operator[]介绍](#🌻2. C++操作符重载函数operator[]介绍)
      • [🌻3. 代码实例](#🌻3. 代码实例)
        • [🌻3.1 一维安全数组带越界检查](#🌻3.1 一维安全数组带越界检查)
        • [🌻3.2 二维矩阵行列访问](#🌻3.2 二维矩阵行列访问)
        • [🌻3.3 类中函数索引](#🌻3.3 类中函数索引)
        • [🌻3.4 更简化的版本:使用0来比较:相等或不象等](#🌻3.4 更简化的版本:使用0来比较:相等或不象等)
      • [🌻3.4 操作符重载函数operator[]总结](#🌻3.4 操作符重载函数operator[]总结)

🌻1. 前言

本篇目的:C++操作符重载函数operator[]用法实例

🌻2. C++操作符重载函数operator[]介绍

  1. 基本概念

    operator[]作为成员函数,把对象当数组使用,接收索引返回引用,支持读写及越界策略。

  2. 功能

    实现随机访问、下标检查、惰性创建、代理对象,可返回普通引用或嵌套代理类。

  3. 使用限制

    必须为成员函数;单参数对应索引;返回值常设计为引用以支持赋值;不可为静态。

  4. 性能特性

    编译器内联后与裸数组同速;边界检查可在调试期启用;代理类可延迟计算。

  5. 使用场景

    自定义矩阵、安全数组、稀疏表、缓存容器、多维数据包装。

🌻3. 代码实例

🌻3.1 一维安全数组带越界检查
  1. 应用场景

    运行时捕获非法下标。

  2. 用法实例

cpp 复制代码
#include <iostream>
struct SafeArr {
    int buf[5];
    int& operator[](size_t i) {
        if (i >= 5) throw "out";
        return buf[i];
    }
};
int main() {
    SafeArr a;
    a[0] = 8;
    std::cout << a[0];
}

输出 8

🌻3.2 二维矩阵行列访问
  1. 应用场景

    图形计算中矩阵元素读写。

  2. 用法实例

cpp 复制代码
#include <iostream>
struct Mat {
    double m[2][2];
    double* operator[](size_t r) { return m[r]; }
};
int main() {
    Mat M;
    M[1][1] = 3.14;
    std::cout << M[1][1];
}

输出 3.14

🌻3.3 类中函数索引
  1. 应用场景

    类中函数索引

  2. 用法实例

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

template<class TYPE>
class SortedVector {
private:
  vector<TYPE> mArray;  

public:
  // 添加元素的方法
  void add(const TYPE& item) { 
    mArray.push_back(item);
  }

  // 定义 operator[] 函数
  const TYPE& operator[](size_t index) const {
    // 从容器中返回指定位置的元素
    return mArray[index];
  }

  // itemAt 调用 operator[]
  const TYPE& itemAt(size_t index) const {
    return operator[](index);  // 等价于 return (*this)[index];
  }

  // 获取大小
  size_t size() const {
    return mArray.size();
  }
};

// 使用示例
int main() {
  SortedVector<int> vec;
  vec.add(10);
  vec.add(20);
  vec.add(30);

  // 方法1:直接使用 []
  int val1 = vec[0];           // 调用 operator[](0)

  // 方法2:调用 itemAt
  int val2 = vec.itemAt(0);    // 最终也是调用 operator[](0)

  // 方法3:显式调用 operator[]
  int val3 = vec.operator[](0);

  // 三种方式的结果相同,都是获取第0个元素
  cout << val1 << " " << val2 << " " << val3;  // 输出:10 10 10

  return 0;
}
🌻3.4 更简化的版本:使用0来比较:相等或不象等
cpp 复制代码
#include <iostream>
#include <type_traits>
using namespace std;

template<typename T>
class sp {
private:
    T* m_ptr;

public:
    sp(T* ptr = nullptr) : m_ptr(ptr) {}

    ~sp() {
        if (m_ptr != nullptr) {
            delete m_ptr;
        }
    }

    T* get() const {
        return m_ptr;
    }
};

class MyClass {
public:
    MyClass() { }
    ~MyClass() {  }
};

// 关键 1:全局 operator!= 重载(与 nullptr_t 比较)
template <typename T>
static inline bool operator !=(const sp<T>& t, std::nullptr_t) {
    cout << "调用 operator!=(sp<T>, nullptr_t)" << endl;
    return t.get() != nullptr;
}

template <typename T>
static inline bool operator ==(const sp<T>& t, std::nullptr_t) {
    cout << "调用 operator==(sp<T>, nullptr_t)" << endl;
    return t.get() == nullptr;
}

int main() {
    sp<MyClass> chain1(new MyClass());

    if (chain1 != 0) {  // ✅ 0 隐式转换为 nullptr_t
        cout << "✅ chain1 非空" << endl;
    } else {
        cout << "❌ chain1 为空" << endl;
    }


    if (chain1 == 0);

    return 0;
}

🌻3.4 操作符重载函数operator[]总结

关键字 功能描述 典型应用
operator[] 随机访问 安全数组
return * 返回引用 矩阵元素
operator[] 顺序访问 顺序数组
相关推荐
SundayBear3 小时前
嵌入式进阶:C语言内联汇编
c语言·开发语言·汇编
零千叶3 小时前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
liulilittle3 小时前
VGW 虚拟路由器ARP剖析
开发语言·c++·编程语言·路由·sd·sdn·vgw
鸡吃丸子4 小时前
Next.js 入门指南
开发语言·javascript·next.js
Juan_20124 小时前
P1040题解
c++·算法·动态规划·题解
wjs20244 小时前
《Foundation 滑块:界面设计的艺术与科学》
开发语言
Onesoft%J1ao4 小时前
C++竞赛递推算法-斐波那契数列常见题型与例题详解
c++·算法·动态规划·递推·信息学奥赛
黄昏晓x4 小时前
C++----多态
java·jvm·c++
William_cl4 小时前
【C# OOP 入门到精通】从基础概念到 MVC 实战(含 SOLID 原则与完整代码)
开发语言·c#·mvc