關於拷貝函式的實現解析

2021-07-24 20:27:31 字數 1456 閱讀 5904

關於拷貝函式分為兩類,一類是strcpy,strncpy,第二類是memcpy,memove,通常情況下,第一類只能處理char,char*的字串型別,第二種可以處理任意型別,它們四個函式都在c語言的庫函式中,標頭檔案為string.h。它們的原型分別如下:

char *strcpy( char *strdestination, const char *strsource );

char *strncpy( char *strdest, const char *strsource, size_tcount );

void *memcpy( void *dest, const void *src, size_tcount );

void *memmove( void *dest, const void *src, size_tcount );

這裡有個小的知識點就是void *後面加引數,表示可接受任意型別。

在字串拷貝函式中,strcpy表示的是不受限制的複製字串拷貝函式,所謂的不受限制就是說它們只是通過尋找字串結尾的'\0'來判斷它的長度在使用時,程式設計師必須保證結果字串不會溢位這塊記憶體。使用這個函式時需要注意的事項:

1.如果引數src和dst在記憶體中出現重疊現象,其結果是未定義的。

2.由於dst引數將進行修改,所以它必須是乙個字元陣列或指向動態分配記憶體的陣列的指標,不能使用字串常量。

3.引數src是不變的,應用const修飾。

4.目標引數以前的內容將覆蓋並丟失,即使源字串比目標字串更短,目標字串最後剩餘的字元也會丟失。

下面我們來模擬實現一下:

char* my_strcpy(char *dst,char *src)

return dst;

}

受限制的字串拷貝函式strncpy,所謂受限制,就是c標準庫中包含了一些函式,他們用不同的方式處理字串,這些函式接受乙個顯示長度的引數,用於限定進行複製或比較的字元數,這些函式提供了一種方便的機制,可以預防難以預料的長字串從他們的目標陣列中溢位。

下面我們來模擬實現一下strncpy函式:

char *my_strncpy(char *dst,const char *src,int len)

*dst = '\0';

return pdst;

}

memcpy和memove都是拷貝函式,但memove考慮到兩個快取區的重疊問題,通常情況下一般用memove來進行拷貝,因為memcpy屬於memove的一種情況,這裡我們只實現memove函式。當目標位址低於原始位址時,應從前往後拷貝,當目標位址高於原始位址時,應從後往前拷貝。

下面我們來模擬實現一下memove函式:

void *my_memmove(void *dst, void *src, int count)

}else

} return ret;

}

關於拷貝建構函式

首先不要使用vc編譯器來測試,看看這段 並猜想它會呼叫幾次建構函式和析構函式,最後再測試一下 在vc編譯執行後結果大失所望吧?不明白不要緊,vc這個整合的ide開發工具它的 博大精深 值得我們慢慢學習與積累,先看看下面我查詢的資料吧 一 拷貝建構函式 拷貝建構函式,是一種特殊的建構函式,它由編譯器呼...

關於拷貝建構函式

1 乙個物件用於給另外乙個物件進行初始化 賦值初始化 2 乙個物件作為函式引數,以值傳遞的方式傳入函式體 3 乙個物件作為函式返回值,以值傳遞的方式從函式返回 原則 對於凡是包含動態分配成員或包含指標成員的類都應該提供拷貝建構函式 對於第一種情況,先用乙個例子進行以下的說明 這個類的主要特點是包含指...

拷貝建構函式關於指標的拷貝問題

1.拷貝建構函式的定義 如果乙個建構函式的第乙個引數是自身型別的引用,且任何額外引數都有預設值。拷貝建構函式的第乙個引數必須是乙個引用型別。合成拷貝建構函式 如果我們沒有為乙個類定義拷貝建構函式,編譯器會為我們定義乙個。編譯器從給定物件中,依次將每個非static成員拷貝到正在建立的物件中。2.拷貝...