從string類談C 深淺拷貝的區別和意義

2021-07-29 22:16:05 字數 1427 閱讀 1318

淺拷貝和深拷貝

深淺拷貝是在c++程式設計中,對於類物件來說,其內部存在各種型別成員變數,在拷貝過程中會出現問題。

淺拷貝在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體

char* _ptr;

int _countref;

_countref對這塊空間進行監視,當一直有指標指向這塊空間時不對它進行釋放,當引用計數為0時再對其釋放,這樣就避免了剛剛出現的問題,具體**如下:

#include 

using

namespace

std;

class string

else

*_countref = 1;

}string(const string & s)

:_ptr(s._ptr)

, _countref(s._countref)

~string()

void release()

}string& operator= (const string & s)

return *this;

}private:

char* _ptr;

int* _countref;

};

寫時拷貝由於釋放記憶體空間,開闢記憶體空間時花費時間,因此,在我們在不需要寫,只是讀的時候就可以不用新開闢記憶體空間,就用淺拷貝的方式建立物件,當我們需要寫的時候才去新開闢記憶體空間。這種方法就是寫時拷貝。在原有的引用計數的基礎上加上寫時拷貝:

char

operator(int index)

return _ptr[index];

}

深拷貝是開闢一塊新的空間,讓新空間中的內容和原空間內容完全相同,然後讓指標指向這塊空間,這樣在析構時不會造成對同一塊記憶體空間釋放多次的情況

#include 

#include

class string

else

}string(const string &s)

:_pstr (_pstr = new

char[strlen(s._pstr) + 1])

string &operator=(const string &s)

return * this ;

}~string() //析構函式

}private:

char* _pstr;

};void funtest()

int main()

合理選用合適的拷貝有利於提高**的效率。

String類與深淺拷貝

1 概念 被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺拷貝僅僅複製所考慮的物件,而不是複製它所引用的物件。2 舉例 class string else string const string s string operator const s...

string類的深淺拷貝問題

字串是我們在編寫程式的時候經常用的到的。c 庫已經幫我們實現了乙個功能更加強大的字串類string,我們要去了解它是怎麼實現的。只要是涉及到 string類的地方多少都會涉及到深淺拷貝的問題。在c 中,在用乙個物件初始化另乙個物件時,只複製了成員,並沒有複製資源,使兩個物件同時指向了同一資源的複製方...

關於string類的深淺拷貝問題

首先,先看一下下面的 會出現什麼問題?class string else string string const string s data s.data private char data void test 上面的程式會奔潰,讓我們來分析原因 這就是所謂的淺拷貝,也稱位拷貝,編譯器只是直接將指標...