问题:
C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组:
| // struct MYSTRUCT { int x,y,z; }; MYSTRUCT table[] = { |
但是如果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> |
////////////////// public: // 一个输出函数 // 这个函数检查是否为空... #ifdef NEVER // 以下是如何初始化一个类数组: void main() |
在C++中,你能用用任何构造函数初始化数组元素,并且C++甚至用缺省的构造函数来初始化额外的元素,而不用外部的初始华例程。对我来说,这是一种进步,而不是不足。