16,547
社区成员




class A
{
int *m_a;
public:
A()//不带参数构造函数,只是为了通过编译
{
int fenge = 4;
};
A(int n)//我需要用的构造函数
{
m_a = new int;
m_a[0] = n;
}
A(A& _a)//深度拷贝构造函数
{
m_a = new int;
}
~A()//析构,清理成员指针
{
delete m_a;
}
};
CArray <A,A> arr;//先不考虑用引用及指针
A a(1); //构造对象0x0012ff2c
arr.Add(a);// 看下面解释,一共生成了3个对象,一个加入到array中
int fenge = 10;//断点分割
arr.RemoveAt(0);//析构加入到array的那个对象,调用析构,delete野指针出错
fenge = 9;
class A{
int *m_a;
public:
A():m_a(NULL){};
A(int n):m_a(NULL){ create(n); };
A(const A& a):m_a(NULL){ init(a.m_a); };
A& operator =(const A& a){
if(&a==this)return *this; //防止自赋值
init(a.m_a);
return *this;
};
~A(){ delete m_a; };
private:
void create(int n){
try { m_a = new int;}
catch(...){}
if(m_a) *m_a= n;
};
void destory(){delete m_a;
m_a=NULL;
};
void init(const int *a){
if(a) create(*a);
else destory();
};
};
然后你在试验一下;class A
{
int *m_a;
public:
A()
{
int fenge = 4;
};
A(int n)
{
m_a = new int;
m_a[0] = n;
}
A(A& _a)
{
*this = _a;
}
~A()
{
delete m_a;
}
A &operator=(A &_a)
{
m_a = new int;
return *this;
}
};
构造第三个对象0x00369ee8(也就是进队列的对象)后,调用=操作符
顺便测试了下以引用方式定义array
CArray <A,A &> arr;
A a(1); // 构造对象 0x0012ff2c
arr.Add(a); // 直接调用无参数构造函数,调用=操作符,跳过中间两个临时对象
int fenge = 10;
arr.RemoveAt(0);
fenge = 9;