如何在自定义C++向量类中重实现可赋值的at()成员函数
实现可赋值的
at()方法的原理与代码 你观察得很细致!std::vector::at()之所以既能取值又能赋值,核心原因是它返回的是元素的引用(reference),而不是元素的副本。引用就像是变量的别名,对引用的赋值会直接作用到原变量上。
接下来针对你的myIntVector类,只需要简单修改at()方法的返回类型,再加上必要的边界检查,就能实现同样的功能:
#include <stdexcept> // 用于抛出越界异常 class myIntVector { int arraye[50] = {0}; // 添加成员变量记录实际存储的元素数量 size_t size_ = 0; public: // 先实现push_back方法,方便后续测试 void push_back(int val) { if (size_ >= 50) { throw std::out_of_range("myIntVector has reached maximum capacity"); } arraye[size_++] = val; } // 修改返回类型为int&,返回数组元素的直接引用 int& at(int index) { // 模仿std::vector::at()的边界检查逻辑 if (index < 0 || static_cast<size_t>(index) >= size_) { throw std::out_of_range("myIntVector::at() index out of valid range"); } return arraye[index]; } // 为const对象提供重载版本,保证const场景下的安全访问 const int& at(int index) const { if (index < 0 || static_cast<size_t>(index) >= size_) { throw std::out_of_range("myIntVector::at() index out of valid range"); } return arraye[index]; } };
关键细节解释:
- 返回引用的作用:把
at()的返回类型从int改为int&后,函数返回的是arraye[index]的直接引用,外部对返回值的赋值操作会直接修改数组内的对应元素,这就是实现“可赋值”的核心。 - 边界检查:和标准库的
std::vector::at()保持一致,当索引越界时抛出std::out_of_range异常,避免非法内存访问导致的未定义行为。 - const重载:添加
const版本的at()后,当myIntVector是const对象时,依然可以安全调用at()获取值(此时返回的是const引用,无法赋值,符合const对象的只读特性)。
测试示例:
#include <iostream> int main() { myIntVector vec; vec.push_back(4); vec.push_back(5); vec.push_back(6); // 获取指定位置的值 std::cout << vec.at(0) << std::endl; // 输出4 // 为指定位置赋值 vec.at(0) = 89; std::cout << vec.at(0) << std::endl; // 输出89 // 测试const对象的访问 const myIntVector& const_vec = vec; std::cout << const_vec.at(0) << std::endl; // 输出89 // const_vec.at(0) = 100; // 这行代码会编译报错,符合const对象的只读要求 return 0; }
这样你的myIntVector的at()方法就完全具备了和std::vector::at()一样的“既能取值又能赋值”的能力,而且全程没有继承或复制标准vector类。
内容的提问来源于stack exchange,提问作者VLN
相关产品推荐
相关产品推荐

