为什么数组索引在此程序中不显示交换行为? 我知道数组索引在C+C++中都是可交换的,所以[i]和i [a]一样,它将具有与i [a]相同的效果,并且两者都是有效的。但最近我编写了一个程序,当我使用I[intob]而不是intob[I]时,该程序无法编译 #include <iostream> #include <cstdlib> using std::cout; template<class T>class atype { T* a; int size; public: atype(int n) { size=n; a=new T[size]; for(auto i=0;i<size;i++) a[i]=i; } ~atype() { delete[] a; } T& operator[](int i); }; template<class T> T& atype<T>::operator[](int i) { if(i<0 || i>size) { cout<<"\nIndex value of "; cout<<i<<" is out of bounds.\n"; exit(1); } return a[i]; // i[a] also works fine here. } int main() { int i,n; cout<<"Enter value of n: "; std::cin>>n; atype<int> intob{n}; atype<long int> longintob{n}; cout<<"Integer array: "; for(i=0;i<n;i++) intob[i]=i; for(i=0;i<n;i++) cout<<i[intob]<<' '; // oops compiler error why??? cout<<'\n'; cout<<"long integer array: "; for(i=0;i<n;i++) longintob[i]=i; for(i=0;i<n;i++) cout<<longintob[i]<<' '; longintob[15]=123; }

为什么数组索引在此程序中不显示交换行为? 我知道数组索引在C+C++中都是可交换的,所以[i]和i [a]一样,它将具有与i [a]相同的效果,并且两者都是有效的。但最近我编写了一个程序,当我使用I[intob]而不是intob[I]时,该程序无法编译 #include <iostream> #include <cstdlib> using std::cout; template<class T>class atype { T* a; int size; public: atype(int n) { size=n; a=new T[size]; for(auto i=0;i<size;i++) a[i]=i; } ~atype() { delete[] a; } T& operator[](int i); }; template<class T> T& atype<T>::operator[](int i) { if(i<0 || i>size) { cout<<"\nIndex value of "; cout<<i<<" is out of bounds.\n"; exit(1); } return a[i]; // i[a] also works fine here. } int main() { int i,n; cout<<"Enter value of n: "; std::cin>>n; atype<int> intob{n}; atype<long int> longintob{n}; cout<<"Integer array: "; for(i=0;i<n;i++) intob[i]=i; for(i=0;i<n;i++) cout<<i[intob]<<' '; // oops compiler error why??? cout<<'\n'; cout<<"long integer array: "; for(i=0;i<n;i++) longintob[i]=i; for(i=0;i<n;i++) cout<<longintob[i]<<' '; longintob[15]=123; },c++,arrays,templates,compiler-errors,C++,Arrays,Templates,Compiler Errors,我得到以下编译器错误 [错误]与“运算符[]”不匹配的操作数类型为“int”和“atype” 但如果我在重载的[]运算符函数中写入I[a],那么它就可以正常工作。为什么? 是否存在使用i[intob]访问数组元素的解决方案 如果我在某个地方错了&理解不正确,请告诉我。索引运算符本身是不可交换的 如果您理解对于数组或指针a和索引i,那么a[i]相当于*a+i,这会有所帮助。交换位来自该加法,因为*a+i等于*i+a,这导致i[a]有效。索引运算符本身是不可交换的 如果您理解对于数组或指针a和索引i

我得到以下编译器错误

[错误]与“运算符[]”不匹配的操作数类型为“int”和“atype”

但如果我在重载的[]运算符函数中写入I[a],那么它就可以正常工作。为什么?

是否存在使用i[intob]访问数组元素的解决方案


如果我在某个地方错了&理解不正确,请告诉我。

索引运算符本身是不可交换的


如果您理解对于数组或指针a和索引i,那么a[i]相当于*a+i,这会有所帮助。交换位来自该加法,因为*a+i等于*i+a,这导致i[a]有效。

索引运算符本身是不可交换的


如果您理解对于数组或指针a和索引i,那么a[i]相当于*a+i,这会有所帮助。交换位来自那个加法,因为*a+i等于*i+a,导致i [a]有效。

因为编译器检查类型,C++中有一个称为运算符重载的东西,这意味着我可以为自己的类型编写自己的运算符:

typedef int stupidInt;

intoperator+(int l, stupidInt r){
  return l-r;
}

int operator+(stupidInt l, int r){
  return l+r;
}
stupidInt a = 3;
int b = 7;

a + b == 10; 
b + a == 4; 
这也适用于操作员[]typea,typeb

某个地方可能有一个定义运算符[]atype,int。也许这是在编译器中硬编码的 但不是相反

也没有真正的理由让你需要换个角度来看待这个问题。但你可以定义

int operator[](int i, atype a){
  return a[i];
}

<>这应该使操作符也反向工作。

因为编译器检查类型,C++中有一个叫做运算符重载的东西,这意味着我可以为自己的类型编写自己的运算符:

typedef int stupidInt;

intoperator+(int l, stupidInt r){
  return l-r;
}

int operator+(stupidInt l, int r){
  return l+r;
}
stupidInt a = 3;
int b = 7;

a + b == 10; 
b + a == 4; 
这也适用于操作员[]typea,typeb

某个地方可能有一个定义运算符[]atype,int。也许这是在编译器中硬编码的 但不是相反

也没有真正的理由让你需要换个角度来看待这个问题。但你可以定义

int operator[](int i, atype a){
  return a[i];
}

这将使运算符也反向工作。

atype违反了三条规则。您有一个析构函数,但没有复制构造函数和复制赋值运算符。如果您编写的是a1、b1类型;a=b;您有内存泄漏和双重空闲。@fredfoverflow:但我没有执行任何分配或复制。那么为什么我需要编写赋值运算符和复制构造函数呢?如果我真的不需要赋值或复制怎么办?那么你应该声明复制构造函数和赋值操作符为private,而不让它们实现。或者=删除它们,如果你有一个C++11编译器。atype违反了三个规则。你有一个析构函数,但没有复制构造函数和复制赋值运算符;a=b;您有内存泄漏和双重空闲。@fredfoverflow:但我没有执行任何分配或复制。那么为什么我需要编写赋值运算符和复制构造函数呢?如果我真的不需要赋值或复制怎么办?那么你应该声明复制构造函数和赋值操作符为private,而不让它们实现。或者=删除它们,如果您有C++11编译器。