欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>一般性编程问题>>C++、MFC>>文章内容
初始化类对象
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
" width="21" height="15" align="absmiddle">
初始化类对象 赵湘宁 问题:
       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)\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++甚至用缺省的构造函数来初始化额外的元素,而不用外部的初始华例程。对我来说,这是一种进步,而不是不足。











附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步