c語言拷貝構(gòu)造函數(shù) c拷貝構(gòu)造函數(shù)詳解

c語言如何實(shí)現(xiàn)結(jié)構(gòu)體的深度復(fù)制

使用memcpy即可, 比如你另外建立一個結(jié)構(gòu)體sortbook[1000]用來保存排序結(jié)果,將book中的第i個元素賦值到sortbook的第j個元素中

成都創(chuàng)新互聯(lián)是一家專業(yè)提供朝天企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為朝天眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

memcpy(sortbook[j], book[i], sizeof(struct book));

用這個函數(shù)需要#include string.h

函數(shù)原型

void *memcpy(void*dest, const void *src, size_t n);

功能

由src指向地址為起始地址的連續(xù)n個字節(jié)的數(shù)據(jù)復(fù)制到以destin指向地址為起始地址的空間內(nèi)。

頭文件

#includestring.h

返回值

函數(shù)返回一個指向dest的指針。

說明

1.source和destin所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向destin的指針。

2.與strcpy相比,memcpy并不是遇到'\0'就結(jié)束,而是一定會拷貝完n個字節(jié)。

memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝的數(shù)據(jù)長度;

例:

char a[100], b[50];

memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會造成b的內(nèi)存地址溢出。

strcpy就只能拷貝字符串了,它遇到'\0'就結(jié)束拷貝;例:

char a[100], b[50];

strcpy(a,b);

3.如果目標(biāo)數(shù)組destin本身已有數(shù)據(jù),執(zhí)行memcpy()后,將覆蓋原有數(shù)據(jù)(最多覆蓋n)。如果要追加數(shù)據(jù),則每次執(zhí)行memcpy后,要將目標(biāo)數(shù)組地址增加到你要追加數(shù)據(jù)的地址。

//注意,source和destin都不一定是數(shù)組,任意的可讀寫的空間均可。

c語言中的位拷貝是什么意思?C++中有位拷貝這個說法嗎?它和拷貝構(gòu)造函數(shù)有什么區(qū)別?

位拷貝也叫淺拷貝。。。是編譯器幫你自動生成的拷貝構(gòu)造函數(shù)做的事情,它只能做一些基本的賦值操作,如果自己定義拷貝構(gòu)造函數(shù)就要防止位拷貝。。因?yàn)槲豢截惾菀装l(fā)生一些錯誤。。

拷貝構(gòu)造函數(shù)、構(gòu)造函數(shù)和賦值語句的區(qū)別

class CStr

{

public:

CStr(); //默認(rèn)構(gòu)造函數(shù)

CStr(const char* psz); //一種廣義拷貝構(gòu)造函數(shù)

CStr(const CStr str); //拷貝構(gòu)造函數(shù)

const CStr operator=(const CStr str); //賦值構(gòu)造函數(shù)

size_t GetSize() const; //這里的const是什么意思?它必須嗎?

operator const char*() const { return m_pdata; }

protected:

const CStr* _Copy(const CStr str);

private:

char* m_pdata;

size_t m_size;

};

CStr::CStr()

{

m_pdata = NULL;

m_size = 0;

}

size_t CStr::GetSize() const

{

return m_size;

}

const CStr* CStr::_Copy(const CStr str)

{

if(this != str)

{

if(m_pdata){

delete[] m_pdata;

}

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)

{

assert(psz);

if(m_pdata != psz)

{

if(m_pdata){

delete[] m_pdata;

}

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)

{

_Copy(str);

}

const CStr CStr::operator=(const CStr str)

{

return *(_Copy(str));

}

int main()

{

const char* psz = "test";

const char* psz1 = "me";

CStr str(psz); //拷貝構(gòu)造函數(shù),此處調(diào)用的是CStr(const char* psz)。 #1

CStr str2(str); // 拷貝構(gòu)造函數(shù),此處調(diào)用的是 CStr(const CStr str) #2

CStr str1 = psz1; // 拷貝構(gòu)造,str1此前并不存在,現(xiàn)在要先構(gòu)造它。 #3

str = str1; // 真正的賦值構(gòu)造函數(shù) #4

return 0;

}

上面這個小型的例子,主要就是為了闡述賦值構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)之間的區(qū)別,其實(shí),賦值構(gòu)造函數(shù)不應(yīng)該被稱為一個構(gòu)造函數(shù),充其量只能算得上一個重載的操作符函數(shù)。

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

在調(diào)用賦值構(gòu)造函數(shù)的時候,類對象已經(jīng)存在,自然談不上構(gòu)造類對象,它只是對該已經(jīng)存在的類對象的成員變量進(jìn)行修改(所謂的賦值)操作。而拷貝構(gòu)造函數(shù)是利用一個已經(jīng)存在的類對象構(gòu)造出一個新的類對象。

回到上面的例子,相信大多數(shù)人都應(yīng)該能分清#1、#2、#4所調(diào)用的函數(shù),而對于#3,賦值構(gòu)造的實(shí)際用意是修改一個已有的對象,而現(xiàn)在str1還沒有被定義,所以此處還是必須要調(diào)用拷貝構(gòu)造函數(shù)先產(chǎn)生一個CStr對象。

最后,定義與賦值同時進(jìn)行的話,必須要先定義,所以必須得先調(diào)用拷貝構(gòu)造函數(shù),而對于符合單純的賦值操作語法的語句(也就是只有兩個操作數(shù)的表達(dá)式)來說,才是真正的調(diào)用賦值構(gòu)造函數(shù)。

拷貝構(gòu)造函數(shù)中,深拷貝在實(shí)際情況具體有什么用呢?

如果定義了拷貝構(gòu)造函數(shù),在賦值操作時就會調(diào)用該拷貝構(gòu)造函數(shù),如定義了Class CTest,然后使用CTest A,CTest B=A時就會調(diào)用CTest類的拷貝構(gòu)造函數(shù)。需要注意的是,和默認(rèn)構(gòu)造函數(shù)不同,只要用戶沒有定義自己的拷貝構(gòu)造函數(shù),編譯器就會提供一個默認(rèn)的拷貝構(gòu)造函數(shù),該函數(shù)的作用是將源對象的數(shù)據(jù)成員的取值復(fù)制到新生成的目標(biāo)對象中。但是值得注意的是,編譯器提供的拷貝構(gòu)造函數(shù)和賦值運(yùn)算符函數(shù)的默認(rèn)實(shí)現(xiàn)都是一個淺層的拷貝操作!即模擬C語言中struct的拷貝和賦值操作,只拷貝對象中數(shù)據(jù)成員的取值,而不管某個數(shù)據(jù)成員是否還引用了其它的數(shù)據(jù)。

如何用c語言實(shí)現(xiàn)CString的構(gòu)造函數(shù),析構(gòu)函數(shù)和賦值函數(shù)

1、首先C語言沒辦法實(shí)現(xiàn)構(gòu)造函數(shù)和析構(gòu)函數(shù),因?yàn)镃語言是面向過程的語言,沒有定義面向?qū)ο蟮腸lass概念。C++語言是以C語言為基礎(chǔ)擴(kuò)展出來的一種編程語言,它在繼承了C語言的基礎(chǔ)上,增加了面向?qū)ο蟮木幊谭椒?,其中就包含了class。

2、如果你所描述的c語言是指C++語言,那么是可以自已定義并實(shí)現(xiàn)CString類的一些功能。因?yàn)镃String類是微軟VC++ MFC實(shí)現(xiàn)的基礎(chǔ)類,而非C++標(biāo)準(zhǔn)類庫,所以CString類定義中使用了一些AFX函數(shù),依賴于MFC環(huán)境,所以想自定義一個完全取代CString的類很困難,也無意義。

3、如果只是需要學(xué)習(xí)CString的構(gòu)造函數(shù)、析構(gòu)函數(shù)及賦值函數(shù),可以參考MFC類庫源文件:

\MICROSOFT VISUAL STUDIO\VC98\MFC\Include\AFX.INL

\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\STRCORE.CPP

\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\WINSTR.CPP

網(wǎng)頁名稱:c語言拷貝構(gòu)造函數(shù) c拷貝構(gòu)造函數(shù)詳解
網(wǎng)頁路徑:http://muchs.cn/article20/dosdpjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、Google外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站制作定制開發(fā)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營