下标表达式(postfix expression )的重载有关问题
下标表达式(postfix expression )的重载问题
下标表达式(postfix expression )通常用于数组元素的访问。
在MSDN https://msdn.microsoft.com/EN-US/library/x96cyk9c(v=VS.120,d=hv.2).aspx 中有写到:
如果 a 是指针类型 b 是整数类型,那么下面四个使用方法是等价的:
现在的问题是,如果想自己实现一个数组(或者容器)
第一个运算可以通过重载 operator [] (int) 来实现,剩下三个如何实现呢?
------解决思路----------------------
不能直接实现。
但是应该可以通过一个 operator T* () 的类型转换来实现,如果你的容器可以支持的话。
------解决思路----------------------
你把类的[]重载和数组[]的使用方式弄混了:
任何数组[]的使用方式都是这四种, 不需要重载,就是c++的语法.
一个是类内的数组,需要重载[], 一个是数组本身的用法.
见下面的例子, 我猜你说的是这个意思:
class MyClass
{
public:
MyClass()
{
pArray = new int[2];
}
MyClass(int ip)
{
pArray = new int[2];
pArray[0] = ip;
}
int & operator [] (int iPos)
{
return (*(pArray + iPos));
}
private:
int *pArray;
};
int _tmain(int argc, _TCHAR* argv[])
{
MyClass *oC = new MyClass[2];
oC[1] = 2; // ①
int b = 1;
*(oC + b) = 4; // ②
*(b + oC) = 5; // ③
b[oC] = 3; // ④
}
------解决思路----------------------
A[B]
*(A+B)
*(B+A)
B[A]
//以上四行等价
"abc"[1]
*("abc"+1)
*(1+"abc")
1["abc"]
//以上四行等价
//所谓等价,是对编译器来说的。
------解决思路----------------------
跟编译原理有关。
下标表达式(postfix expression )通常用于数组元素的访问。
在MSDN https://msdn.microsoft.com/EN-US/library/x96cyk9c(v=VS.120,d=hv.2).aspx 中有写到:
如果 a 是指针类型 b 是整数类型,那么下面四个使用方法是等价的:
a[b]
*(a + b)
*(b + a)
b[a]
现在的问题是,如果想自己实现一个数组(或者容器)
第一个运算可以通过重载 operator [] (int) 来实现,剩下三个如何实现呢?
------解决思路----------------------
不能直接实现。
但是应该可以通过一个 operator T* () 的类型转换来实现,如果你的容器可以支持的话。
------解决思路----------------------
你把类的[]重载和数组[]的使用方式弄混了:
任何数组[]的使用方式都是这四种, 不需要重载,就是c++的语法.
一个是类内的数组,需要重载[], 一个是数组本身的用法.
见下面的例子, 我猜你说的是这个意思:
class MyClass
{
public:
MyClass()
{
pArray = new int[2];
}
MyClass(int ip)
{
pArray = new int[2];
pArray[0] = ip;
}
int & operator [] (int iPos)
{
return (*(pArray + iPos));
}
private:
int *pArray;
};
int _tmain(int argc, _TCHAR* argv[])
{
MyClass *oC = new MyClass[2];
oC[1] = 2; // ①
int b = 1;
*(oC + b) = 4; // ②
*(b + oC) = 5; // ③
b[oC] = 3; // ④
}
------解决思路----------------------
A[B]
*(A+B)
*(B+A)
B[A]
//以上四行等价
"abc"[1]
*("abc"+1)
*(1+"abc")
1["abc"]
//以上四行等价
//所谓等价,是对编译器来说的。
------解决思路----------------------
跟编译原理有关。