問題:
C++中如何初始化類中的表數據?在C語言中,我能像下面這樣初始化結構數組:
//
strUCt MYSTRUCT {
int x,y,z;
};MYSTRUCT table[] = {
{ 1,2,3 },
{ 4,5,6 },
... // etc
};
//
但是假如MYSTRUCT是個C++類,而不是結構,我編譯就會出錯。我覺得這是C++的一個不足。
解答: 這個問題完全取決於你如何看待C++。C++的一個優點之一便是它強制你做正確的事情。例如,C++不喜歡創建對象時不調用構造函數。這只就是為什麼你不能用原始數據初始化類對象的原因,不管是部分數組還是其它數據。 構造函數的目的是保證每一個對象都被正確初始化,不管你是從程序棧,可用內存堆分配空間,還是作為靜態數組元素。讓原始數據旁路掉構造函數被忌諱的事情。也導致你不能用初始的數據來創建對象靜態數組——你必須調用構造函數!
//
class CFooble {
int x,y,z;
public:
CFooble(int xx, int yy, int zz)
: x(xx),y(yy),z(zz) { ... }
CFooble(int i) { x=y=z=i; }
};
CFooble table[] = {
CFooble(1,2,3),
CFooble(4,5,6),
CFooble(0), // can use any constructor!
};
//
下面的代碼是個可以編譯的完整例子。
//
// StaticClassArray — 說明如何初始化在C++對象的靜態C數組
// 編譯方法如下:
//
// cl fooble.cpp
//
#include <stdio.h>
更多內容請看C/C++技術專題專題,或
//////////////////
// 一個典型的類——有三個數據成員...
//
class CFooble {
protected:
int x,y,z;public:
// 兩個構造函數...
CFooble(int i) { x=y=z=i; }
CFooble(int xx, int yy, int zz) : x(xx),y(yy),z(zz) { } // 一個輸出函數
void print() {
printf("CFooble at %p: (%d,%d,%d)
", this, x, y, z);
} // 這個函數檢查是否為空...
int IsEmpty() {
return x==0 && y==0 && z==0;
}
};#ifdef NEVER
// 如下這樣將不能運行—不能“生硬”地進行C++類對象的初始化!
CFooble table[] = {
{ 1,2,3 },
{ 4,5,6 },
{ 0,0,0 }
};
#endif// 以下是如何初始化一個類數組:
CFooble table[] = {
CFooble(1,2,3),
CFooble(4,5,6),
CFooble(0), // 甚至可以是用不同的構造器!
};void main()
{
for (CFooble* pc=table; !pc->IsEmpty(); pc++) {
pc->print();
}
}
//
在C++中,你能用用任何構造函數初始化數組元素,並且C++甚至用缺省的構造函數來初始化額外的元素,而不用外部的初始華例程。對我來說,這是一種進步,而不是不足。
更多內容請看C/C++技術專題專題,
或