【问题标题】:C++ Operator Overload [ ] [closed]C++ 运算符重载 [] [关闭]
【发布时间】:2016-12-16 18:06:11
【问题描述】:

假设我有以下课程:

class temp1 {
private:
    int A;
    double B;
};

class temp2 {
private:
    int A[20];
    double B;
};

void main() {
    temp1 a[100];
    temp2 b;
}

现在的问题是为什么我只需要为 temp2 而不是 temp 1 重载运算符 []? 我知道为了在类 temp 2 中获得可验证 A 中的 10 索引,我确实需要重载运算符 [] 但主要我有类数组 (temp1 a[100]) 那么当我使用 [ ] 运算符而不重载一个运算符时,编译器如何知道我的意思。

【问题讨论】:

  • 你真的试过运行代码吗?你有错误吗?
  • "我知道,为了在类 temp 2 中获得可验证 A 中的 10 索引,我确实需要重载运算符 []"。为什么?
  • 它与错误有什么关系?我不会得到任何错误..但这不是我的问题,如果我尝试做 b[5],即使我的目标是从 temp 2 获取 A 的 [i] 索引,我也会得到错误,但编译器不明白这一点运算符重载。我问别的事情,为什么 temp1 不需要运算符重载? (我不在乎它是否有效,我试图在这里理解一些事情)
  • 我没有看到。你的问题也没有意义,因为它们是不同的东西。 atemp1 的数组,而 btemp2 的对象,它具有 20 个 ints 数组的成员
  • @Itay.V 我不确定你是否知道其中的区别...a 是一个包含 100 个 temp1s 实例的 数组btemp2单个实例。单个对象与对象数组不同;数组可以使用方括号运算符,因为这就是数组在语言中的定义方式。如果你想使用带有括号运算符的 object,你必须自己定义行为。

标签: c++ operator-overloading


【解决方案1】:

在您的示例中,局部变量a 是一个数组。数组类型为T 的值与T 类型的值不同,它的行为更类似于T* 类型的指针。


指针(或数组)不能直接使用,就好像它们是它们所指向的类型一样。

考虑一下Foo 类型:

class Foo {
    public: doStuff() {
        std::cout << "hello" << std::endl;
    }
};

如果我有

Foo* f = new Foo[2];

我不能说f.doStuff();这样做需要fFoo(而不是Foo*)。

为了从f 获得Foo,我必须取消引用它为*f。例如

(*f).doStuff(); // -> hello

这清楚地表明 C++ 将指针类型视为特殊类型——它们自动定义了特殊操作,其中之一是 *

我将f 定义为包含两个元素的(动态分配的)数组。

我们可以使用*f引用第一个元素f[0]

第二个元素可以被*(f+1)引用f[1]引用。

[] 是 C++ 中另一个指针(和数组)类型的特殊运算符。意思或多或少

T& operator[](T* pointer, int index) {
    return *(pointer + index);
}

在您的示例中,局部变量 b 的类型为 temp2temp2 不是指针,因此编译器没有任何b[10] 的定义。如果你想这样做,temp2 类型必须显式提供它的定义。

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,在以下情况下,编译器将假定您正在指定要声明的数组的长度:

    int A[20];

    在以下情况下,它将假定您使用下标运算符“[]”来到达括号中的指定索引:

    A[2] = 3; // after variable declaration.

    【讨论】:

    • 不完全是,我只是想知道我是否会继续处理我的主要工作并做一些类似 A[15] 的事情,为什么我不需要重载运算符,为什么编译器会理解我的意思我正在寻找 A 数组中的第 15 个索引
    • @Lianthe:实际上这是因为[] 是 C 风格数组的索引运算符,而不是类型本身。它适用于任何类型的 C 样式数组,而不仅仅是基元。
    • @AndyG 你说得对,我完全在想别的东西:o
    • @Itay.V 就像 AndyG 说的那样,你不需要为 C 样式数组重载 [] 运算符。但是,当您创建像 vector. 这样的类时,您需要重载索引运算符
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多