代码之家  ›  专栏  ›  技术社区  ›  alexgolec

何时调用常量运算符[],何时调用非常量运算符[]?

  •  1
  • alexgolec  · 技术社区  · 14 年前

    非常 不同的读写行为。在读取的情况下,我想复制一个很难提取的数据结构的缓冲区。在写的时候,我只会写无缓冲的结构。

    到目前为止,我一直在使用操作符[]进行访问,所以为了多态性,我想继续这样做。

    所以我的问题是:当进行访问时,调用哪个版本?我的概念是常量用于读取,非常量用于写入。在这种情况下,这是一个简单的实现。否则,可能会更棘手。

    4 回复  |  直到 14 年前
        1
  •  6
  •   Jerry Coffin    14 年前

    operator[] 返回一个代理,然后重载 operator= operator T (其中 T 是该代理类型的原始类型)。那你可以用 操作员T 处理读取,以及 operator = 处理写入。

    琐碎的 语义(只需在向量的指定索引处读写一个字符);在你的例子中,逻辑 操作员= 和(特别是) 操作员T

    #include <vector>
    
    class X {
        std::vector<char> raw_data;
    
        class proxy { 
            X &parent;
            int index;   
        public:
            proxy(X &x, int i) : parent(x), index(i) {}
    
            operator char() const { return parent.raw_data[index]; }
    
            proxy &operator=(char d) { 
                parent.raw_data[index] = d; 
                return *this;
            }
        };
    public:
        X() : raw_data(10) {}
        proxy operator[](int i) { return proxy(*this, i); }
    };
    
    #ifdef TEST
    
    #include <iostream>
    
    int main() {
        X x;
        for (int i=0; i<10; i++)
            x[i] = 'A' + i;
    
        for (int i=0; i<10; i++)
            std::cout << x[i] << "\n";
        return 0;
    }
    #endif
    
        2
  •  3
  •   Maciej Hehl    14 年前

    过载分辨率基于 this 参数,即-在您调用 operator[] 打开。

        3
  •  0
  •   Mark B    14 年前

    operator[] read write 方法。

    回答你的问题,它是基于你操作的对象的常数。它不知道你要对操作符的结果做什么,所以它只有一件事要处理,就是你调用操作符的对象。如果对象是非常量,它将始终调用运算符的非常量(write)版本。你呢 可以 const_cast

        4
  •  -2
  •   miked    14 年前

    这取决于你“分配”给什么:

    const type& x=X[i]
    

    type& x=X[i]
    

    X[i]=x
    

    将调用非常量版本。最后,一个简单的任务

    type x=X[i]
    

    没有真正的方法说一个是“读”,另一个是“写”。基本上,const版本会将一个视图返回到数据中,其中没有反映更新。non-consts版本将返回一个视图到您的数据中,其中可以反映更新,但没有语义来提供写入后的刷新。