class assemble
{
private:
int *elem;
int sum;
public:
int addelem(int num); //在集合中增加一个元素值为num
int cutelem(int num); //在集合中删除一个元素值为num
void display(); //显示所有的集合中的元素
int getelem(int num,int *find_flag); //将集合中的值为num个元素取出
//没有该元素则*find_flag=0;
int getsum(); //返回集合中的元素个数    
//------------------------------------------------------------------------------//
friend assemble operator && (assemble a,assemble b);
//‘与’运算符重载,表示集合相交
//返回assemble类型的对象 friend assemble operator || (assemble a,assemble b);
//‘或’运算符重载,表示集合并
//返回assemble类型的对象

//assemble operator !(assemble I); //‘补’运算符重载,表示集合a在全集
//I中求补,返回assemble类型的对象
void operator = (assemble b); //‘赋值’运算符重载,返回assemble
//类型的对象,在一般情况下,该函数认为调用该函数的对象的elem指针已指向已存在比b.sum
//大的空间,如果比b.sum小则重新分配空间,释放原空间 //------------------------------------------------------------------------------//
assemble();
assemble(int i); //构造函数添加元素num
assemble(int *i,int num); //构造函数添加num个元素从数组i[]中
~assemble();
};void assemble::operator = (assemble b)
{
int i;
if(b.sum ==0)
{sum=0;return;}
if(sum<b.sum)
{ if(sum!=0) delete []elem;
elem=new int[b.sum ];
}
for(i=0;i<b.sum;i++)
*(elem+i)=*(b.elem +i);
if(sum<b.sum ) sum=b.sum;

}
assemble operator && (assemble a,assemble b)
{   
int flag,t,elem_total,i,*temp;
elem_total=0;     //elem_total为知道集合相交后的集合大小
if(a.sum<=b.sum )
temp=new int[b.sum];
else
temp=new int[a.sum];
for(i=0;i<b.sum ;i++)
{
t=a.getelem(*(b.elem+i),&flag); 
if(flag==1)
{
*(temp+elem_total)=*(b.elem +i);//暂时存储相同项
elem_total++; //计算elem_total的大小
}
}
    if(elem_total==0) //相交后为空集
{
delete []temp;
assemble c;
return(c);
} assemble c(temp,elem_total);
delete []temp;
return(c); 
}
//-----------------------------------//
int main(int argc, char* argv[])
{
int num,flag;
int arr[]={1,3,2};
int arr1[]={1,2,3,4};
flag=0;
assemble c1(arr,3);
c2=c1;
c3=c1&&c2;                      //wrong
c3.display();
cin>>num;
return 0;
}
在进行追踪分析时发现c1&&c2并没有错误,错误产生与=号的重载函数,在重载函数中的参数b中,b.sum=3,但是*(b.elem)的值是错误的,请问为什么,如何更正???