对于内置类型整数数组来说
int a[10];
int i = 2;
a[i] = 10;
或者
i[a] = 10;
因为
a[i]
是 *(a+i)
或 *(i+a)
的后缀表达式,因为交换属性添加。
我想为用户定义的类型实现它
class Dummy
{
//
};
这可能吗? 如果是那么如何? 如果不是,那是为什么?
编辑:- 我知道它很丑但是下面的代码编译:- g++ -转储版本 4.3.3
#include <stdio.h>
#include<iostream>
#include <string.h>
#include <malloc.h>
using namespace std;
int main()
{
string ArrayS[10];
2[ArrayS] = "ADASD" ;
cout << 2[ArrayS] << endl;
return 0;
}
最佳答案
这是不可能的,因为“operator[]
应该是一个只有一个参数的非静态成员函数”(标准 §13.5.5/1),所以你不能定义第一个参数参数是 native 标量类型。
(此外,非静态运算符重载调用被解释为成员调用,因此第一个操作数不能隐式转换,这与自由函数重载不同。这就是尽可能首选自由函数重载的原因之一。)
无论好坏,index[ object ]
都是一种确保不会调用 operator[]
重载的方法。
不过。
“表达式 E1[E2]
等同于(根据定义)*((E1)+(E2))
”(§5.2.1)和 operator+
可以重载,只要一侧不是 native 类型。这留下了两个选项漏洞:“数组”必须是一个类,或者“索引”必须是一个类或枚举
。
然后您必须定义一个代理类型来保存“加法”的结果,它定义了一个 operator*
重载。然而,GCC 不支持这一点。我将深入研究其他平台和引用资料。
编辑:啊,§13.6/13 覆盖 5.2.1 并声明,为了解释涉及类或枚举类型的表达式,有函数 T& operator[](std::ptrdiff_t, T* );
和 T& operator[](T*, std::ptrdiff_t);
。就是这样。
关于c++ - 交换属性 a[i] == i[a],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612554/