Class A
{
public:
char id[18];
char name[40];
A()
{
memset(this,0,sizeof(A));
}
~A()
{
}
....... 其他成員函式
.......
}
class B
{
public:
A a;
double x;
char Filename[256];
B()
{
memset(this,0,sizeof(B));
}
~B()
{
}
...... 其他成員函式
.......
}
class C
{
public:
A a;
double x;
char Filename[256];
init()
{
memset(this,0,sizeof(C));
}
C()
{
init();
}
~C()
{
}
...... 其他成員函式
.......
}
請教上述初始化是否正確,類B和類C的初始化有什么差別嗎?能不能這樣使用?為什么?
uj5u.com熱心網友回復:
A() { memset(this,0,sizeof(A)); } 不如用初始化串列 : A(): id(0),name(0) {}memset 的好處是不用多寫初始化代碼,簡單清0。
一個問題是平臺兼容性,并非所有平臺的編譯器都支持memset。
另一個是性能問題,memset 是系統呼叫,系統呼叫并不快。
再有,一些成員不能簡單清0的,要小心,否則出錯。
C++中使用初始化串列,能得到好的優化,就是寫代碼多些。
你上面的代碼,在繼承體系下。就多處呼叫了 memset .
類B與C的初始化方式是一樣的。
B初始化程序: 成員a 初始化,呼叫memset B建構式再次呼叫memset 重復設定一部分記憶體為0,效率低下。
雖然效率低些,但這樣用是可以的,this指標在建構式下依然有效,因為是先分配記憶體,執行成員初始化(所以初始化串列方式能得到最好的優化)后,再執行建構式。
uj5u.com熱心網友回復:
memset(this,0,sizeof(C)); 這種代碼只會在某種情況下沒問題。老老實實的每個陣列類的成員 分別用memset
uj5u.com熱心網友回復:
memset是標準C的函式,可以說是個C\C++編譯器都會有的。
陣列初始化不是id(0)這種, 應該是 id{},但得看編譯器是否支持這個C++11特性。
uj5u.com熱心網友回復:
akirya 說得對,謝謝。我只是印象中memset在有些C編譯器上不支持,回頭卻找不出是哪個。
用memset 來清0的做法是不好的。樓主的例子是沒有虛函式,可以用,如果存在虛函式或者任意一成員存在虛函式,則可能連虛函式表一起清0,造成程式崩潰。(注:虛函式表放在哪,如何實作沒有規定),如果可以就用初始化串列
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122193.html
標籤:基礎類
