【问题标题】:C++ operator[] syntaxC++ 运算符[] 语法
【发布时间】:2009-11-01 23:50:31
【问题描述】:

只是一个快速的语法问题。我正在写一个地图类(学校)。

如果我定义以下运算符重载:

template<typename Key, typename Val> class Map {...
Val* operator[](Key k);

当用户写作时会发生什么:

Map<int,int> myMap;
map[10] = 3;

这样做只会覆盖 Key k 处的 [null] 指针的临时副本。是否可以这样做:

map[10] = 3;
printf("%i\n", map[10]); 

使用相同的运算符重载?

【问题讨论】:

    标签: c++ map operators operator-overloading


    【解决方案1】:

    它与std::map 一起工作的方式是,如果键不存在,映射类将插入一个默认值,然后返回一个左值(与键关联的值的可分配引用),所以它可以分配一个新值。

    因此,在以下代码示例中,假设 map 为空,这会将 10 插入到映射中并将其与值 3 相关联。

    map[10] = 3;
    

    使用您的自定义地图类,operator[] 应首先检查 Key k 是否存在,如果不存在,则将新的键/值对(使用 typename Val 的默认构造函数)插入到地图中。然后,您可以返回对与新键关联的值的引用,以便用户可以为其分配值。请注意,这意味着 Val 必须是 Assignable 并且具有默认构造函数。

    这允许operator[] 用于插入和查找。您还应该重载operator[]const 版本,它当然只支持查找。

    编辑:我现在在您的代码中注意到您正在返回一个指针。如果您想使用 std::map 使用的 operator[] 的插入/查找范例,返回引用更有意义。返回指针的好处是您可以检查 operator[] 的返回值是否为 NULL 以检查键是否不存在,但同样,如果您希望 operator[] 同时提供查找和插入功能,则引用将成为这里的路。

    【讨论】:

    • 所以我应该将我的重载定义为 Val& operator[] (Key k);和 ofc 确保我正确初始化,即使那里没有任何东西。
    • 非常感谢;即使不是“需要”,我也必须制作对象,这有点可惜。
    • 好吧,你没有必须那样做。 [] 运算符是为了方便类用户而严格提供的。用户始终可以使用正常的查找/插入功能。
    • 另外,最好将您的重载定义为:Val&amp; operator[] (const Key&amp; k);,这样您就可以通过引用而不是值来传递 k。
    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2017-08-04
    • 2013-05-19
    • 2012-02-28
    相关资源
    最近更新 更多