【问题标题】:Clarification on Operators运营商说明
【发布时间】:2011-05-16 11:09:23
【问题描述】:

我一直在阅读类运算符并遇到以下示例:

class Array {
public:
     int& operator[] (unsigned i) { if (i > 99) error(); return data[i]; }
private:
     int data[100];
};

这是否意味着我可以用我想要的任何东西替换[]?例如,我可以使用括号吗?

另外,int& operator[] 中的 & 符号有什么意义?


稍微不那么重要的一点是,使用int& operator [] 代替int& operator[] 在语法上是否正确?

【问题讨论】:

    标签: c++ class operators


    【解决方案1】:

    这是否意味着我可以将 [ 和 ] 替换为我想要的任何内容?

    不!并非所有运营商can be overloaded

    例如,我可以使用括号吗?

    你可以,但你不应该。

    另外,int& operator[] 中的 & 符号有什么意义?

    这意味着您将 reference 返回到 int 变量。

    编辑:稍微不那么重要的一点是,使用int& operator [] 而不是int& operator[] 在语法上是否正确?

    两者没有区别。

    【讨论】:

    • 我明白了。当我的对象是被复制的对象时,我将如何定义 = 运算符的行为?
    • @Maxpm :阅读thisthis
    【解决方案2】:

    您正在做的是定义一个包装简单整数数组的 Array 类。通过重载 [] 运算符,您可以像访问任何其他数组一样访问数组的每个元素,这里的优点是您正在检查上级限制以避免缓冲区溢出。与号表示您正在返回对数组元素的引用,它允许您分配一个值并获取一个值。在 C++ 中,当您重载 [] 运算符时,不要忘记 const 和非 const 版本:

    int& operator[] (conts int a) {...}
    int operator[] (conts int a) {...} const
    

    【讨论】:

      【解决方案3】:

      你可以使用括号,因为还有一个

      operator()
      

      和一些库(例如 boost::blas)这样做。 BUT:你不能编新括号,因为没有operator{}operator<>

      请回答您的语法问题:没有尝试过,但不这么认为,因为operator[] 是函数的名称,您不应该在函数名称中添加空格。

      【讨论】:

        【解决方案4】:

        虽然您可以随意定义运算符,但括号会是个问题。原因是与类构造函数冲突!数组(25),这是什么意思?我不确定这是否被允许(尽管我很确定其他人会知道),但关键是即使你被允许这样做你也会遇到问题。

        通常 - 用作运算符的符号可以重载/重新定义您可以指定 ==、&、> 和 [] 如何为您的类工作。您现在无法确定字母“q”意味着某种比较。至于 () 问题,我不确定。

        引用标记 & 是索引所必需的,因为您可能希望对返回的地址进行赋值,而不仅仅是获得一个值。如果您允许松散的描述,那么您的“大多数”运营商将不需要这样做。

        【讨论】:

          【解决方案5】:

          1) C++ 中没有一组固定的可用“可重载”运算符。
          请参阅维基百科中的此表:
          http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Table
          每个表中都有一个“可重载”列

          2) int& 表示您正在返回对值的引用。
          References in C++ 类似于指针,值得单独讨论,但在此处的运算符 如果您将此运算符用作赋值的左侧操作数,它允许什么,例如

          x[3] = 0;
          

          如果它只返回一个 int 就行不通了;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-12
            • 2018-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-20
            相关资源
            最近更新 更多