拷貝建構函式與賦值建構函式的區別

2021-06-05 12:57:35 字數 1240 閱讀 8088

class cstr

protected:

const cstr* _copy(const cstr& str);

private:

char* m_pdata;

size_t m_size;};

cstr::cstr()

size_t cstr::getsize() const

const cstr* cstr::_copy(const cstr& str)

m_size = str.getsize();

m_pdata = new char[m_size + 1]; assert(m_pdata);

strcpy(m_pdata, str);}

return this;

}cstr::cstr(const char* psz) : m_pdata(null), m_size(0)

m_size = strlen(psz);

m_pdata = new char[m_size + 1]; assert(m_pdata);

strcpy(m_pdata, psz);}}

cstr::cstr(const cstr& str): m_pdata(null), m_size(0)

const cstr& cstr::operator=(const cstr& str)

int main()

上面這個小型的例子,是我剛剛為大家編寫的,這個例子主要就是為了闡述賦值建構函式與拷貝建構函式之間的區別,其實,我的看法是,賦值建構函式不應該被稱為乙個建構函式,充其量只能算得上乙個過載的操作符函式。

在c語言中,我們知道"=="是判等操作符,而"="卻是乙個賦值操作符,所以只要沒有出現"="操作符,也就不會有賦值操作可言。

我之所以認為賦值建構函式不應該被稱為乙個建構函式,是因為在呼叫賦值建構函式的時候,類物件已經存在,自然談不上構造類物件,它只是對該已經存在的類物件的成員變數進行修改(所謂的賦值)操作。而拷貝建構函式是利用乙個已經存在的類物件構造出乙個新的類物件。

回到上面的例子,相信大多數人都應該能分清#1、#2、#4所呼叫的函式,而對於#3,我想著重說明的是:賦值構造的實際用意是修改乙個已有的物件,而現在str1還沒有被定義,所以此處還是必須要呼叫拷貝建構函式先產生乙個cstr物件。

最後,請大家記住:定義與賦值同時進行的話,必須要先定義,所以必須得先呼叫拷貝建構函式,而對於符合單純的賦值操作語法的語句(也就是只有兩個運算元的表示式)來說,才是真正的呼叫賦值建構函式。

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

include stdafx.h include include using namespace std class a a a a 過載拷貝函式 a int id,char t name a char name a operator a a 注意 此處一定要返回物件的引用,否則返回後其值立即消失!...

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

什麼時候用拷貝建構函式,和賦值建構函式 一 當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 乙個物件以值傳遞的方式從函式返回 乙...

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

class和struct很大乙個區別在於,c除了成員的訪問控制許可權,struct中的成員預設是public,而class中的field預設是private class還有乙個special的地方是它有建構函式 constructor。建構函式是class中的一員,和成員變數 其他成員函式一起構成乙...