简介: 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[]介绍
-
基本概念
operator[]作为成员函数,把对象当数组使用,接收索引返回引用,支持读写及越界策略。
-
功能
实现随机访问、下标检查、惰性创建、代理对象,可返回普通引用或嵌套代理类。
-
使用限制
必须为成员函数;单参数对应索引;返回值常设计为引用以支持赋值;不可为静态。
-
性能特性
编译器内联后与裸数组同速;边界检查可在调试期启用;代理类可延迟计算。
-
使用场景
自定义矩阵、安全数组、稀疏表、缓存容器、多维数据包装。
🌻3. 代码实例
🌻3.1 一维安全数组带越界检查
-
应用场景
运行时捕获非法下标。
-
用法实例
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 二维矩阵行列访问
-
应用场景
图形计算中矩阵元素读写。
-
用法实例
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 类中函数索引
-
应用场景
类中函数索引
-
用法实例
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[] | 顺序访问 | 顺序数组 |