`
yesjavame
  • 浏览: 697038 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

初始化类对象

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

相关推荐

    WPF 对象初始化器_1 对象初始化器_1

    对象初始化器则提供了一种更简洁、更易读的方式来初始化对象及其成员。 #### 二、对象初始化器应用场景 1. **简化初始化流程**:当需要初始化多个属性时,对象初始化器可以减少代码量。 2. **提高代码可读性**:...

    php初始化对象类.zip

    主要是对php初始化对象和析构函数的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助。当对象内部的操作执行完毕的时候,__destruct()被调用, 然后对象所使用的内存被释放出来。

    对象初始化流程梳理对象初始化流程梳理

    Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...

    Java静态初始化块和对象初始化块

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    类继承的初始化顺序类,继承的初始化顺序

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    EnumTest-初始化类的类成员对象(初始化列表方式).zip

    总结,`EnumTest-初始化类的类成员对象(初始化列表方式)`这个主题强调了如何在C++中使用初始化列表来初始化类的枚举成员和其他类成员对象,这是编写高效且易于理解的代码的关键实践之一。正确使用初始化列表可以...

    C++全局变量初始化的一点总结

    动态初始化则涉及运行时的动作,比如需要函数调用或类构造函数的初始化。这些变量的初始化在main函数执行之前进行,但晚于静态初始化。这意味着如果一个全局变量依赖于其他全局变量的初始化结果,必须确保这些依赖的...

    C++类成员和数据成员初始化总结

    在C++编程中,类成员和数据成员的初始化是一个至关重要的概念,因为它直接影响到对象的创建和使用。这里我们将深入探讨这些知识点。 首先,当创建一个C++类的对象时,对象的构造过程遵循一定的顺序。这包括两步:1)...

    java中对象创建、初始化、引用

    - **初始化对象**:通过构造器初始化新创建的对象,设置其初始状态。 - **赋值**:最后,将创建好的对象的引用赋给之前声明的引用变量。 例如,下面的代码展示了如何创建一个`A`类的对象: ```java A a1 = new A()...

    java面试题-类的初始化顺序.doc

    这意味着静态成员和静态初始化块对于所有类的实例都是共享的,而实例成员和实例初始化块则是每个对象独有的。 在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时...

    C++构造函数初始化列表

    在C++编程语言中,构造函数是对象生命周期开始时自动调用的特殊成员函数,用于初始化对象的状态。构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类中的成员进行初始化,而不是先分配...

    c++ 子类构造函数初始化及父类构造初始化的使用

    我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。  构造函数...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    C++程序设计与实践:06-第6章 深入类和对象.ppt

    * 构造函数的初始化列表:用于初始化对象的成员。 * 析构函数的定义:只有一个析构函数,可以释放对象占据的资源。 掌握使用对象、对象指针和对象引用作为函数参数的方法: * 对象作为函数参数:可以将对象作为...

    类和对象的初始化过程.zip

    在Java编程语言中,类和对象的初始化是程序运行的基础,因为它们构成了面向对象编程的核心。这个压缩包文件包含三个源代码文件:StaticTest.java、Test.java和Father.java,它们可能用于演示类和对象初始化的不同...

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    SpringBoot项目启动时实现调用一次初始化方法.docx

    通过以上介绍,我们可以根据项目的需求选择合适的初始化方式,`@PostConstruct`适合简单的初始化,`CommandLineRunner`适合多个初始化步骤并控制执行顺序,而启动类中的初始化方法则更灵活,但应避免过度使用。...

    java程序初始化顺序

    在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的代码至关重要。以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**...

Global site tag (gtag.js) - Google Analytics