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