论坛首页· 友情链接申请·申请版主· 广告投放· 道具中心· 设为首页· 收藏本站
发新话题
打印

[教程] 初始化类对象

初始化类对象

问题:

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++甚至用缺省的构造函数来初始化额外的元素,而不用外部的初始华例程。对我来说,这是一种进步,而不是不足。


因为梦想而努力,因为有你而精彩!
mail: qianzongming@gmail.com

TOP

支持起来

提示: 作者被禁止或删除 内容自动屏蔽

TOP

发新话题