析构函数定义:
1:与类同名,前面有~,不能重载
2:每当对象不再作用域之类或者通过delete删除之后,被销毁是,都会自动的调 用析构函数。是重置变量以及释放动态内存的场所。
浅拷贝和深拷贝
所谓浅拷贝,就是说编译器提供的默认的拷贝构造函数和赋值运算符重载函数,仅仅是将对象a中各个数据成员的值拷贝给对象b中对应的数据成员(这里假设a、b为同一个类的两个对象,且用a拷贝出b或用a来给b赋值),而不做其它任何事。
当对象被拷贝(包括按值传递给函数)时,浅拷贝,如果析构函数中有释放内存的操作,函数结束时(不在作用域时),会delete空间,这是多余的操作,因为当等到main函数结束或者需要正常delete空间时,又会去释放一次内存,这时候会提示错误。现在有2钟解决方法,第一种最常用,使用拷贝构造函数。
拷贝构造函数:
每当对象被复制或者被按值调用的时候,会自动的调用这个函数,目的是确保对所有的缓冲区进行深复制!例如mystring(const mystring& copysource)接受一个以引用方式传递的对象,这个参数(copysource)是源对象的别名(引用)。
重载复制运算符:
#include <iostream>
#include<string>
#include<cstring>
using namespace std;
class mystring
{
private:
char* buffer;
public:
mystring(const char* p)
{
if (p!=NULL)
{
buffer=new char [strlen(p)+1];
strcpy(buffer,p);
}
else
buffer = NULL;
}
mystring(const mystring& copy);//拷贝构造函数
mystring& operator = (const mystring& copy)//运算符重载
{
if ((this!= ©)&&(copy.buffer!=NULL))
{
if (buffer!=NULL)
{
delete[] buffer;
}
buffer =new char [strlen(copy.buffer)+1];
strcpy(buffer,copy.buffer);
}
return *this;
}
~mystring()
{
if (buffer!=NULL)
{
delete[] buffer;
}
}
operator const char*()
{
return buffer;
}
};
int main()
{
mystring string1("hello ");
mystring string2("world ");
cout<<string1<<string2<<endl;
string2 =string1;
cout<<string1<<string2<<endl;
return 0;
}