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类的新对象的构造函数,发生了什么?为什么? 我知道发生什么事我会感激信息。
答案 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;
如果您只在一个地方使用重载运营商,那就太过分了。但是当你在许多地方使用重载运算符时,我发现这个技巧非常方便。