1、 当一个类中不写出拷贝构造函数、拷贝赋值函数、析构函数,这三个函数时,编译器提供默认的构造函数、拷贝赋值函数、析构函数函数。
2、 当一个类中有指针成员时,进行对象的拷贝或者赋值时,就必须自己写出拷贝构造函数、拷贝赋值函数和析构函数函数。否则编译提供的默认拷贝构造函数、拷贝赋值函数,那么对象与对象之间在进行拷贝或者赋值时,对象的指针成员就会进行浅拷贝操作。也就是把指针成员的值拷贝给另外一个对象的指针成员,那么这两个指针都指向了同一个内存块,这样后面的操作就很危险,例如析构时同一块内存第二次释放时会报错,所以应避免这种浅拷贝,拷贝赋值函数也同理。
例如:
char *p1 = new char[100];
char *p2 = p1;//指针赋值
delete [ ] p1;//释放内存
delete [ ] p2; //内存已释放,此句执行时报错
3、 自己定义拷贝构造函数时,函数的参数要以引用的方式传入。自己定义拷贝赋值函数,函数的参数也一样的要以引用的方式传入。在拷贝赋值函数实现时,一定要注意,必须检测自己赋值给自己的情况,否则把自己所指向的内存删除后,再拷贝给自己将会影响结果或者出错。
inline CMyString&
CMyString::operator = (const CMyString& str)
{
if (this == &str)
{
return *this;
}
delete [] m_pdata;
m_pdata = new char[strlen(str.m_pdata)+1];
strcpy(m_pdata, str.m_pdata);
return *this;
}
网友评论