龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++基础:初始化类对象[组图]

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
问题: C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组: // strUCt MYSTRUCT { int x,y,z; };MYSTRUCT table[] = { { 1,2,3 }, { 4,5,6 }, ... // etc }; // 但是假如MYSTRUCT是个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) ", 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++技术专题专题,
   或
  
精彩图集

赞助商链接