当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 初始化类对象

VC++
如何有效地使用对话框
一个定制CFileDialog对话框的实例
XP风格复活节彩蛋的实现
程序界面多模式显示的实现
改变视图单调的背景
使窗体拥有透明效果的API
《电子尺》V1.02程序开发实例
美化你的应用程序的外观界面
个人考勤软件开发实例
使用VC6.0实现窗口的任意分割
如何让一个打开的文档成为活动文档
创建非矩形窗口的简单方法
轻松实现类VC界面
视图的缩放的完整论述
如何获得另一个应用程序窗口中的文本
如何发送命令到文档对象
动画窗口的实现-VC++实例一则
如何在其他程序的窗口上创建按钮并使之能响应
如何在基于对话框的程序中动态设置鼠标指针
扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝

VC++ 中的 初始化类对象


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 46 ::
收藏到网摘: n/a


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