美文网首页
面向对象高级篇上-第二周(GeekBand)

面向对象高级篇上-第二周(GeekBand)

作者: kds怪兽 | 来源:发表于2016-05-22 22:40 被阅读0次

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;

}

相关文章

网友评论

      本文标题:面向对象高级篇上-第二周(GeekBand)

      本文链接:https://www.haomeiwen.com/subject/fntarttx.html