You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++类中重载下标运算符的赋值操作?

解决C++类下标运算符的赋值支持问题

你的问题出在当前的operator[]返回的是字符串的副本,赋值操作只会修改这个临时副本,无法影响类内部的成员变量。要实现values[1] = "XYZ"这种赋值,需要让operator[]返回成员变量的引用,这样就能直接操作类内部的成员。

修改方案

  1. 将operator[]的返回类型从string改为string&,返回成员变量的引用以支持左值赋值。
  2. 补充const版本的operator[],保证const对象的下标访问符合const正确性。
  3. 优化赋值运算符参数为const vector<string>&,避免不必要的拷贝开销。
  4. 增加下标越界检查,提升代码健壮性。

修改后的完整代码

#include <iostream>
#include <vector>
#include <string>
#include <cassert>

using namespace std;

class Test {
public:
    Test& operator=(const vector<string>& val) {
        assert(val.size() == 3 && "Input vector must contain exactly 3 elements");
        a = val[0];
        b = val[1];
        c = val[2];
        return *this;
    }

    // 非const版本,返回引用支持赋值
    string& operator[](int index) {
        assert(index >= 0 && index <= 2 && "Index out of valid range");
        if (index == 0) return a;
        else if (index == 1) return b;
        else return c;
    }

    // const版本,返回const引用仅支持读取
    const string& operator[](int index) const {
        assert(index >= 0 && index <= 2 && "Index out of valid range");
        if (index == 0) return a;
        else if (index == 1) return b;
        else return c;
    }

private:
    string a = "";
    string b = "";
    string c = "";
};

int main()
{
    Test values;
    values = { "X","Y","Z" };
    cout << values[0] << endl;
    cout << values[2] << endl;

    // 现在可以执行下标赋值操作
    values[1] = "XYZ";
    cout << values[1] << endl;

    // const对象的下标访问测试
    const Test const_values = { "A", "B", "C" };
    cout << const_values[0] << endl;
    // const_values[0] = "D"; // 编译错误,符合const约束
}

关键说明

  • 返回string&:让operator[]直接关联类内部的成员变量,赋值操作会直接修改类的成员而非临时副本。
  • const版本重载:确保const对象只能读取成员,不能修改,符合C++的const正确性设计原则。
  • 断言检查:调试模式下如果下标越界会直接终止程序,方便定位问题;若需要发布模式下的错误处理,可替换为抛出std::out_of_range异常。

内容的提问来源于stack exchange,提问作者Alex DeStefano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:24:58