WEB开发网
开发学院软件开发C++ C++基础:初始化类对象 阅读

C++基础:初始化类对象

 2008-03-08 21:33:56 来源:WEB开发网   
核心提示:问题: C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组: //strUCt MYSTRUCT { int x,y,z;};MYSTRUCT table[] = { { 1,2,3 }, { 4,5,6 }, ... // etc};// 但是假如MYSTRUCT是个C++类,C++基
问题:
    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)\n", 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++技术专题专题,

Tags:基础 初始化 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接