初始化類對象 |
趙湘寧 |
問題: 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>//////////////////// 一個典型的類有三個數據成員...//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++甚至用缺省的構造函數來初始化額外的元素,而不用外部的初始華例程。對我來說,這是一種進步,而不是不足。 |
新聞熱點
疑難解答
圖片精選