物件導向之拷貝建構函式和賦值函式之一

2021-06-15 10:21:04 字數 1351 閱讀 2838

題:編寫類string的建構函式、析構函式和賦值函式。【中國某著名綜合軟體公司2023年面試題】

答案:已知類string的原型為:

class string

;

編寫string的上述4個函式。

1、string的析構函式

為了防止記憶體洩漏,我們還需要定義乙個析構函式。當乙個string物件超出它的作用域時,這個析構函式將會釋放它所占用的資源。**如下:

string::~string()

2、string的建構函式

這個建構函式可以幫助我們根據乙個字串常量建立乙個mystring物件。這個建構函式首先分配了足量的記憶體,然後把這個字串常量複製到這塊記憶體,**如下:

string::string(const char *str)

else

}

strlen函式返回這個字串常量的實際字元數(不包括null終止符),然後把這個字串常量的所有字元賦值到我們在string物件建立過程中為m_data資料成員新分配的記憶體中。有了這個建構函式後,我們可以像下面這樣根據乙個字串常量建立乙個新的string物件:

string str("hello");

3、string的拷貝建構函式

所有需要分配系統資源的使用者定義型別都需要乙個拷貝建構函式,這樣我麼可以使用這個的宣告:

mystring s1("hello");

mystring s2 = s1;

拷貝建構函式還可以幫助我們在函式呼叫中以傳值方式傳遞乙個mystring引數,並且在當乙個函式以值的形式返回mystring物件時實現「返回時複製」。

string::string(const string &other)

4、string的賦值函式

賦值函式可以實現字串的傳值活動:

mystring s1(「hello」);

mystring s2;

s1 = s2;

**如下:

string & string::operator =(const string &other)

//釋放原有的記憶體資源

delete m_data;

//分配新的記憶體資源,並複製內容

int length = strlen(other.m_data);

m_data = new char[length+1];

strcpy(m_data,other.m_data);

//返回本物件的引用

return *this;

}

拷貝建構函式和賦值構造

為什麼空類可以建立物件呢?複製建構函式的引數可以是 const 引用,也可以是非 const 引用。一般使用前者,這樣既能以常量物件 初始化後值不能改變的物件 作為引數,也能以非常量物件作為引數去初始化其他物件。乙個類中寫兩個複製建構函式,乙個的引數是 const 引用,另乙個的引數是非 const...

拷貝建構函式和賦值建構函式

class cmystring 賦值建構函式 cmystring cmystring operator const cmystring str 新分配記憶體,將str的m pdata記憶體拷貝到m pdata中 m pdata new char strlen str.m pdata 1 strcpy...

拷貝建構函式和賦值建構函式

拷貝構造是確確實實構造乙個新的物件,並給新物件的私有成員賦上引數物件的私有成員的值,新構造的物件和引數物件位址是不一樣的,所以如果該類中有乙個私有成員是指向堆中某一塊記憶體,如果僅僅對該私有成員進行淺拷貝,那麼會出現多個指標指向堆中同一塊記憶體,這是會出現問題,如果那塊記憶體被釋放了,就會出現其他指...