關於「非基本型別需慎用memcpy函式」的分析

2021-06-01 18:51:35 字數 1270 閱讀 1995

假設我們要將乙個元素型別為t的物件陣列複製到另外乙個陣列中,我可以很輕鬆寫出如下**

t sour[n];

t dest[n];

int i;

for(i = 0; i < n; i++)

dest[i] = sour[i];

在c和c++中,上述**都可以生效

然而,c程式設計師可能更喜歡用下面的方案

t sour[n];

t dest[n];

int i;

memcpy(dest, sour, n*sizeof(t));

這種做法在c中能很好的工作,然而如果t是非基本型別,上述**在c++中就有可能會帶來災難,因為memcpy是按位拷貝,這涉及到深拷貝和淺拷貝的問題

如果型別t具有下面的特徵,則不能對其使用memcpy

1.型別t需要顯式定義複製建構函式和賦值操作符

2.型別t不需要顯式定義複製建構函式和賦值操作符,但其底層資料成員需要顯式定義複製建構函式和賦值操作符

參照下列**

#include #include using namespace std;

//不能對b使用memcpy函式的原因是顯而易見的

class b

b(const b& b)

b& operator=(const b& b)

return *this;

} ~b() };

//a不需要定義複製建構函式、賦值操作符、析構操作符,但也不能對a使用mencpy函式

class a

};void main()

執行結果

b的建構函式

b的建構函式

測試a是否需要賦值

a1: 00036208 1

a2: 00036238 2

呼叫b的賦值操作符

a1: 00036208 2

a2: 00036238 2

測試a是否複製構造

b的建構函式

a3: 000362e0 1

b的複製建構函式

a4: 00036310 1

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

注:預設的賦值操作符和複製建構函式遞迴的依賴於底層類的成員的複製和賦值的定義,它不僅僅像c版本的結構體那樣僅實施按位複製,它只向內建型別成員變數實施按位複製,預設的析構函式也遞迴的依賴於底層類的析構函式

關於基本型別int與包裝類integer的面試內容

首先integer是int的包裝類,然後int的預設值是0,並且int不能為null,而integer的預設值為null,即integer可以區分出為賦值和值為0的區別,例如 區分未參加考試和參加考試的零分。另外integer提供了多個與整數操作的方法,如將字串轉化為整數 integer.pasei...

關於基本型別變數占有位元組問題 面試有用

int的長度由處理器 16位,32位,64位 和比哪一期決定。首先從處理器來講 16位處理器中的int 占有16位 即2個位元組 32位處理器中int占有32位 即4個位元組 64位處理器中int占有64位 即8個位元組 附錄 16位平台 char 1個位元組8位 short 2個位元組16位 in...

關於基本型別變數占有位元組問題 面試有用

int的長度由處理器 16位,32位,64位 和比哪一期決定。首先從處理器來講 16位處理器中的int 占有16位 即2個位元組 32位處理器中int占有32位 即4個位元組 64位處理器中int占有64位 即8個位元組 附錄 16位平台 char 1個位元組8位 short 2個位元組16位 in...