使用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è)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進行中。
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.如果目標數(shù)組destin本身已有數(shù)據(jù),執(zhí)行memcpy()后,將覆蓋原有數(shù)據(jù)(最多覆蓋n)。如果要追加數(shù)據(jù),則每次執(zhí)行memcpy后,要將目標數(shù)組地址增加到你要追加數(shù)據(jù)的地址。
//注意,source和destin都不一定是數(shù)組,任意的可讀寫的空間均可。
位拷貝也叫淺拷貝。。。是編譯器幫你自動生成的拷貝構(gòu)造函數(shù)做的事情,它只能做一些基本的賦值操作,如果自己定義拷貝構(gòu)造函數(shù)就要防止位拷貝。。因為位拷貝容易發(fā)生一些錯誤。。
class CStr
{
public:
CStr(); //默認構(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ū)別,其實,賦值構(gòu)造函數(shù)不應(yīng)該被稱為一個構(gòu)造函數(shù),充其量只能算得上一個重載的操作符函數(shù)。
在C語言中,我們知道"=="是判等操作符,而"="卻是一個賦值操作符,所以只要沒有出現(xiàn)"="操作符,也就不會有賦值操作可言。
在調(diào)用賦值構(gòu)造函數(shù)的時候,類對象已經(jīng)存在,自然談不上構(gòu)造類對象,它只是對該已經(jīng)存在的類對象的成員變量進行修改(所謂的賦值)操作。而拷貝構(gòu)造函數(shù)是利用一個已經(jīng)存在的類對象構(gòu)造出一個新的類對象。
回到上面的例子,相信大多數(shù)人都應(yīng)該能分清#1、#2、#4所調(diào)用的函數(shù),而對于#3,賦值構(gòu)造的實際用意是修改一個已有的對象,而現(xiàn)在str1還沒有被定義,所以此處還是必須要調(diào)用拷貝構(gòu)造函數(shù)先產(chǎn)生一個CStr對象。
最后,定義與賦值同時進行的話,必須要先定義,所以必須得先調(diào)用拷貝構(gòu)造函數(shù),而對于符合單純的賦值操作語法的語句(也就是只有兩個操作數(shù)的表達式)來說,才是真正的調(diào)用賦值構(gòu)造函數(shù)。
如果定義了拷貝構(gòu)造函數(shù),在賦值操作時就會調(diào)用該拷貝構(gòu)造函數(shù),如定義了Class CTest,然后使用CTest A,CTest B=A時就會調(diào)用CTest類的拷貝構(gòu)造函數(shù)。需要注意的是,和默認構(gòu)造函數(shù)不同,只要用戶沒有定義自己的拷貝構(gòu)造函數(shù),編譯器就會提供一個默認的拷貝構(gòu)造函數(shù),該函數(shù)的作用是將源對象的數(shù)據(jù)成員的取值復(fù)制到新生成的目標對象中。但是值得注意的是,編譯器提供的拷貝構(gòu)造函數(shù)和賦值運算符函數(shù)的默認實現(xiàn)都是一個淺層的拷貝操作!即模擬C語言中struct的拷貝和賦值操作,只拷貝對象中數(shù)據(jù)成員的取值,而不管某個數(shù)據(jù)成員是否還引用了其它的數(shù)據(jù)。
1、首先C語言沒辦法實現(xiàn)構(gòu)造函數(shù)和析構(gòu)函數(shù),因為C語言是面向過程的語言,沒有定義面向?qū)ο蟮腸lass概念。C++語言是以C語言為基礎(chǔ)擴展出來的一種編程語言,它在繼承了C語言的基礎(chǔ)上,增加了面向?qū)ο蟮木幊谭椒?,其中就包含了class。
2、如果你所描述的c語言是指C++語言,那么是可以自已定義并實現(xiàn)CString類的一些功能。因為CString類是微軟VC++ MFC實現(xiàn)的基礎(chǔ)類,而非C++標準類庫,所以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://jinyejixie.com/article20/dosdpjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、Google、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站制作、定制開發(fā)、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)