初始化类对象

2016-01-29 12:19 8 1 收藏

初始化类对象,初始化类对象

【 tulaoshi.com - 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//////////////////// 一个典型的类——有三个数据成员...//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++甚至用缺省的构造函数来初始化额外的元素,而不用外部的初始华例程。对我来说,这是一种进步,而不是不足。

来源:http://www.tulaoshi.com/n/20160129/1485589.html

延伸阅读
一、 引言 C# 3.0中新的对象初始化器是一种简单的语法特征-借助于这种特征,对象的构建和初始化变得非常简单。假定你有一个类Student,它看起来有如下样子: public class Student{ public string firstName; public string lastName;} 那么,你可以使用对象初始化器来创建这个类的一个对象,如下所示: var stud...
final变量的初始化位置 一是其定义处,也就是说在final变量定义时直接给其赋值, 二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。 三是在初如化代码块中{} 或者 static{} 代码如下: public class InitOrder {     {         System.out.println("before---field");  ...
一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,格式为: 数组名 = new 数组元素的类型 [数组元素的个数] 实例: TestNew.java: 程序代码: public class TestNew {public static void main(String args[]) { int[] s ; int i ; s = new...
  全部引导过程是四步 1:boot PROM phase 2:boot Programs phase 3:kernel initialization phase 4:init phase system初始化,检测内存和cpu,检查设备和创建设备树,设置console kernel初始化过程 kernel self -initialization 内核自检 loading of kernel modules 载入内核模块 rea...
继承类的构建过程是向外扩散的,子类初始化了,父类一定也初始化了 代码如下: class Art{  Art(){   System.out.println("Art");  } } class Drawing extends Art{  Drawing(){   System.out.println("Drawing");  } } public class Cartoon extends Drawing {  Cartoon(){   System....

经验教程

884

收藏

17
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部