1、C++中什么都不写,就有6个默认函数,由系统自动提供:

构造函数,拷贝构造函数,赋值语句,析构函数,对一般对象的取地址符,对常对象的取地址重载;

对&运算符的重载:

Test t3;

Test *pt = &t3;

Test*operator&(){returnthis;}

对常对象的取地址重载;

const Test t4;

const Test *pt1 = &t4;

constTest*operator&()const{returnthis;}

2、深拷贝与浅拷贝

#include<iostream>#include<string.h>#include<malloc.h>usingnamespacestd;classString{public:String(constchar*str=""){if(str==NULL){data=newchar;data[0]=0;}else{data=newchar[strlen(str)+1];strcpy(data,str);}}~String(){delete[]data;}private:char*data;};intmain(void){Stringt1("abcdef");Stringt2=t1;Stringt3("hello");t3=t1;return0;}

运行结构如下:


可以知道,程序崩了,我们用的是系统默认的拷贝构造函数和赋值语句,此时只是各成员之间的赋值,


两个对象通过默认的拷贝构造,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间;

此时在最后调用析构函数时,形成了对同一空间的多次释放,是错误操作!!!,这就是浅拷贝。

两个对象通过默认的赋值语句,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间,浅赋值。

解决方案,此时应给自己写拷贝构造和赋值语句,达成深拷贝:

String(constString&s){data=newchar[strlen(s.data)+1];strcpy(data,s.data);}String&operator=(constString&s){if(this!=&s){delete[]data;data=newchar[strlen(s.data)+1];strcpy(data,s.data);}return*this;}

深拷贝和深赋值的意思:就是重新申请空间,各自保存自己的,最后在自己释放自己的,保证了对内存访问的安全性;

深赋值应当注意以下四步:

(1)、判断自己是否给自己赋值

(2)、释放原有空间 //有可能在构造对象时,已经指向了某一空间,此时就得先释放,不然就内存泄漏

(3)、申请空间进行赋值

(4)、返回引用空间