日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深淺拷貝——string

對(duì)于一般的對(duì)象,如:

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),訥河企業(yè)網(wǎng)站建設(shè),訥河品牌網(wǎng)站建設(shè),網(wǎng)站定制,訥河網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,訥河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

int a = b;

int c = 5;

它們之間的賦值,復(fù)制很簡單,到對(duì)于類對(duì)象來說,其內(nèi)部存在各種成員變量,他的復(fù)制,賦值就不是如此的簡單,如果處理不當(dāng),就會(huì)出現(xiàn)各種問題。

我們首先來看一下下面的代碼:

#include

using namespace std;

#include

class String

{

public:

String(const char* ptr)

:_ptr(new char[strlen(ptr) + 1])

{

strcpy(_ptr, ptr);

cout << "String" << endl;

                cout << _ptr << endl;

}

String(const String& ptr)

:_ptr(ptr._ptr)

{}

String& operator=(const String& ptr)

{

if (this != &ptr)

{

_ptr = ptr._ptr;

}

return *this;

}

~String()

{

cout << "~String" << endl;

delete[] _ptr;

}

private:

char * _ptr;

};

void Test()

{

String s("hello");

String s2(s);

}

int main()

{

Test();

return 0;

}

深淺拷貝——string

可以看到,這里對(duì)同一對(duì)象析構(gòu)了兩次,我們通過下面的圖來對(duì)這個(gè)現(xiàn)象進(jìn)行解釋:

深淺拷貝——string

在進(jìn)行對(duì)象復(fù)制后,事實(shí)上s、s2里的成員指針_ptr都指向了一塊內(nèi)存空間(即內(nèi)存空間共享了),在s1析構(gòu)時(shí),delete了成員指針_ptr所指向的內(nèi)存空間,而s2析構(gòu)時(shí)同樣指向(此時(shí)已變成野指針)并且要釋放這片已經(jīng)被s1析構(gòu)函數(shù)釋放的內(nèi)存空間,這就讓同樣一片內(nèi)存空間釋放了兩次 ,從而出錯(cuò)。而淺拷貝還存在著一個(gè)問題,因?yàn)橐黄臻g被兩個(gè)不同的子對(duì)象共享了,只要其中的一個(gè)子對(duì)象改變了其中的值,那另一個(gè)對(duì)象的值也跟著改變了。

在這里呢我們找到了深拷貝來解決這個(gè)問題。

下面是深拷貝的拷貝構(gòu)造函數(shù)代碼:

String(const String& ptr)

:_ptr(new char[strlen(ptr._ptr) + 1])

{

strcpy(_ptr, ptr._ptr);

}

這里通過重新開辟一段空間來解決淺拷貝中析構(gòu)兩次的情況。

在淺拷貝中還存在其他的一些問題,比如賦值運(yùn)算符重載,他也是s,s1,兩個(gè)對(duì)象指向同一塊內(nèi)存空間。在析構(gòu)時(shí)同樣會(huì)出現(xiàn)問題。還有析構(gòu)函數(shù),如果這塊空間為NULL,又怎么能進(jìn)行析構(gòu)呢!

我們給出深拷貝的函數(shù)代碼:

class String

{

public:

String(const char* ptr)

:_ptr(new char[strlen(ptr) + 1])

{

strcpy(_ptr, ptr);

}

String(const String& ptr)

:_ptr(new char[strlen(ptr._ptr) + 1])

{

strcpy(_ptr, ptr._ptr);

}

String& operator=(const String& ptr)

{

if (this != &ptr)

{

                        delete[] _ptr;

char* tmp = new char[strlen(ptr._ptr) + 1];

strcpy(tmp, ptr._ptr);

_ptr = tmp;

}

return *this;

}

~String()

{

if (_ptr)

{

delete[] _ptr;

}

}

private:

char* _ptr;

};

void Test()

{

String s("hello");

String s2(s);

String s3("11111");

s3 = s;

}

int main()

{

Test();

return 0;

}

通過深拷貝我們就能解決淺拷貝的問題。

對(duì)深拷貝中的賦值運(yùn)算符重載我們做以下說明:

1.進(jìn)入賦值運(yùn)算符重載,我們首先需要判斷該對(duì)象是不是自己給自己賦值,自己給自己賦值從賦值上來說也沒錯(cuò),但是在調(diào)用析構(gòu)函數(shù)時(shí)又怎該去析構(gòu)呢?不是又給同一對(duì)象析構(gòu)兩次嗎?

2.賦值運(yùn)算符重載的深層理解

String& operator=(const String& ptr)

s3 = s;

賦值運(yùn)算符重載傳參是其實(shí)是這樣的:s3.operator=(&s3,s),&s3其實(shí)就是this指針,在實(shí)現(xiàn)賦值運(yùn)算符重載的過程中,首先析構(gòu)掉s3原本空間的內(nèi)容,然后開辟一段新空間,把s的內(nèi)容復(fù)制到新空間中,再把新空間的內(nèi)容給給s3,完成賦值。


網(wǎng)站欄目:深淺拷貝——string
鏈接URL:http://www.dlmjj.cn/article/jhhdes.html