c ++ operator []重载问题(工作正常但不是指针,为什么?)

时间:2010-02-07 20:54:49

标签: c++ operators operator-overloading

c ++中的operator []问题,我有一些类:

197 class Permutation{
198         private:
199                 unsigned int* array;
200                 unsigned int size;
201
202                 void fill(){
203                         for(unsigned int i=0;i<size;i++)
204                                 array[i]=i;
205                 }
206                 void init(const unsigned int s){
207                         if(s){
208                                 array=new unsigned int[s];
209                                 size=s;
210                         }else{
211                                 size=0;
212                                 array=0;
213                         }
214                 }
215                 void clear(){
216                         if(array){
217                                 delete[]array;
218                                 array=0;
219                         }
220                         size=0;
221                 }
222         public:
223                 Permutation(const unsigned int& s=0):array(0),size(0){
224                         init(s);
225                         fill();
226                 }
227                 ~Permutation(){
228                         clear();
229                 }
230                 unsigned int& operator[](const unsigned int& idx){
231                         assert(idx<size);
232                         return array[idx];
233                 }
234                 unsigned int& get(const unsigned int& idx)
235                 {
236                         assert(idx<size);
237                         return array[idx];
238                 }


253                 Permutation& operator=(const Permutation& p){
254                         clear();
255                         init(p.size);
256                         size=p.size;
257                         for(unsigned int i=0;i<size;i++)
258                                 array[i]=p.array[i];
259                         return *this;
260                 }
261
262                 Permutation(const Permutation&p)
263                 {
264                         clear();
265                         init(p.size);
266                         size=p.size;
267                         for(unsigned int i=0;i<size;i++)
268                                 array[i]=p.array[i];
269                 }
};

当我使用

Permutation x(3);
x[0]=1;

效果很好,但是当我使用时:

Permutation* x=new Permutation(3);
x->get(0)=10; // this works fine
x[0]=1;

在这种情况下,在调试器中我看到它被称为Permutation类的新对象的构造函数,发生了什么?为什么? 我知道发生什么事我会感激信息。

3 个答案:

答案 0 :(得分:6)

首先,您的代码:

Permutation* x=new Permutation(3);
x->get(0)=10; // this works fine

然后你这样做:

x[0]=1;

你正在做的是将指针x视为一个数组,并初始化它,这是一个简单的:

x[0] = Permuation(1);  // implicit conversion using Permulation(const unsigned long&)

你打算写的是:

(*x)[0]=1;  // follow x and then invoke the [] operator

或等同于:

x->operator[](0) = 1;

答案 1 :(得分:2)

对于指针,x[0]相当于*(x+0),相当于*x。所以你实际上是在分配Permutation对象。

由于您要分配值1,因此使用Permutation(const unsigned int&)转换构造函数。这将创建一个Permutation类型的临时表,然后使用您的赋值运算符将其复制到对象*x中。

答案 2 :(得分:0)

我想提出一个关于如何更容易地写这个的另一个选项。您可以创建引用,而不是使用指针:

Permutation &rx = *x;
rx[0] = 1;  // same as (*x)[0] = 1;

如果您只在一个地方使用重载运营商,那就太过分了。但是当你在许多地方使用重载运算符时,我发现这个技巧非常方便。