C++ C++;操作员过载[]

C++ C++;操作员过载[],c++,operator-overloading,C++,Operator Overloading,假设我有以下课程: class temp1 { private: int A; double B; }; class temp2 { private: int A[20]; double B; }; void main() { temp1 a[100]; temp2 b; } 现在的问题是,为什么我只需要为temp2而不是temp1重载操作符[]? 我知道,为了在类temp2中获得veriable A中的10个索引,我需要重载操作符[],但基

假设我有以下课程:

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

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

void main() {
    temp1 a[100];
    temp2 b;
}
现在的问题是,为什么我只需要为temp2而不是temp1重载操作符[]? 我知道,为了在类temp2中获得veriable A中的10个索引,我需要重载操作符[],但基本上我有一个类数组
(temp1 a[100])因此,当我使用[]运算符而不重载时,编译器如何知道我的意思。

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

inta[20]

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


A[2]=3;//在变量声明之后。

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


指针(或数组)不能像它们所指向的类型那样直接使用

考虑以下
Foo
类型:

class Foo {
    public: doStuff() {
        std::cout << "hello" << std::endl;
    }
};
我不能说f.doStuff()
;这样做需要
f
成为
Foo
(而不是
Foo*

为了从
f
中获取
Foo
,我必须将其解引用为
*f
。比如说

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

这清楚地表明C++将指针类型视为特殊类型,它们自动定义了特殊操作,其中之一是“代码> */COD>”。p> 我将

f
定义为两个元素(动态分配)的数组

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

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

<代码> []/COD>是C++中指针(和数组)类型的另一种特殊运算符。意思差不多

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


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

您是否确实尝试过运行该代码?你有错误吗?“我知道为了在类temp2中得到veriable A中的10索引,我需要重载操作符[]”。为什么?它与错误有什么关系?我不会犯任何错误。。但这不是我的问题,如果我尝试做b[5],我会得到错误,尽管我的目标是从temp 2获得A的[i]索引,但如果没有运算符重载,编译器无法理解这一点。我在问另外一件事,为什么temp1不需要操作员过载?(我不在乎它是否有效,我试图理解这里的一些事情)我没有看到。你的问题也没有意义,因为它们是不同的东西
a
temp1
的数组,而
b
temp2
的对象,其具有20
int
数组的成员s@Itay.V我不确定你是否知道其中的区别
a
是由
temp1
s的100个实例组成的数组
b
是a
temp2
的单个实例。单个对象与对象数组不同;数组可以使用方括号运算符,因为在该语言中数组就是这样定义的。如果你想用括号操作符来定义一个对象,你必须自己定义它的行为。不完全是这样,我只是想知道我是否会继续使用main并做一些事情,比如[15]为什么我不需要重载操作符,为什么编译器理解我的意思是我在一个array@Lianthe:实际上,这是因为
[]
是C样式数组上的索引运算符,而不是类型本身。它适用于任何类型的C样式数组,而不仅仅是原语。@AndyG你说得对,我完全是在想别的事情:o@Itay.V正如AndyG所说,对于C风格的数组,不需要重载
[]
操作符。但是,当您创建一个类似vector的类时,您需要重载索引操作符。
T& operator[](T* pointer, int index) {
    return *(pointer + index);
}