1、C++中什么都不写,就有6个默认函数,由系统自动提供:
构造函数,拷贝构造函数,赋值语句,析构函数,对一般对象的取地址符,对常对象的取地址重载;
对&运算符的重载:
Test t3;
Test *pt = &t3;
Test* operator&(){
return this;
}
对常对象的取地址重载;
const Test t4;
const Test *pt1 = &t4;
const Test* operator&()const{
return this;
}
2、深拷贝与浅拷贝
#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;
class String{
public:
String(const char *str = ""){
if(str == NULL){
data = new char;
data[0] = 0;
}else{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
}
~String(){
delete []data;
}
private:
char *data;
};
int main(void){
String t1("abcdef");
String t2 = t1;
String t3("hello");
t3 = t1;
return 0;
}
运行结构如下:
可以知道,程序崩了,我们用的是系统默认的拷贝构造函数和赋值语句,此时只是各成员之间的赋值,
两个对象通过默认的拷贝构造,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间;
此时在最后调用析构函数时,形成了对同一空间的多次释放,是错误操作!!!,这就是浅拷贝。
两个对象通过默认的赋值语句,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间,浅赋值。
解决方案,此时应给自己写拷贝构造和赋值语句,达成深拷贝:
String(const String &s){
data = new char[strlen(s.data) + 1];
strcpy(data, s.data);
}
String& operator=(const String &s){
if(this != &s){
delete []data;
data = new char[strlen(s.data) + 1];
strcpy(data, s.data);
}
return *this;
}
深拷贝和深赋值的意思:就是重新申请空间,各自保存自己的,最后在自己释放自己的,保证了对内存访问的安全性;
深赋值应当注意以下四步:
(1)、判断自己是否给自己赋值
(2)、释放原有空间 //有可能在构造对象时,已经指向了某一空间,此时就得先释放,不然就内存泄漏
(3)、申请空间进行赋值
(4)、返回引用空间
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。