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)、返回引用空間
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。