扩展阅读
  • Python namedtuple对象json序列化/反序列化及对象恢复
  • jquery对象和javascript对象即DOM对象相互转换
  • c#对象中两种copy操作:深拷贝(Deep Copy)与浅拷贝(Shallow Copy)
  • 请问如何把StringBuffer 的对象转化成一个InputStream 的对象,或者InputStream 子类的对象也可以!
  • php中检测变量是否是一个对象的is_object函数介绍及用法举例
  • 判断一个对象是否为jquery对象的方法
  • java tomcat实现Session对象的持久化原理及配置方法介绍
  • Glib对象系统(也称为"GObject")内部是如何实现面向对象特征的呢?
  • 将ResultSet结果集中的记录映射到Map对象中
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • php 5.5.14数据对象(PDO)介绍及PDO的预定义常量介绍
  • 你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
  • 请问:能不能动态的运行时生成对象(动态定义对象), 要涉及到哪些技术, 反射,序列化...??
  • 重新编译PLSQL中的无效对象或者指定的对象 的方法
  • jquey笔记之dom对象与jquery对象互换的例子
  • 有人问我:何为面向对象编程?我给不出确切或形象的说法。谢!vb、pb等开发工具是不是面向对象编程的语言。
  • 写一个方法,向它传递一个对象,循环打印出对象层次结构中的所有类?thinking in java里面的一个习题不知道如何做请教高手?
  • “当某个实例不再被任何对象引用时就会被垃圾回收机制回收”,那么怎样才算是不被任何对象引用呢?
  • 我的APPLET在Jbuilder5中,可以调用EJB对象,但是移植到网页上却不能调用EJB对象!是何缘故,值得研究!
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • 1. 请问linux下可以使用“typedef list<对象*> 对象列表名 ”和iterator吗?
  •  
    当前位置:  编程语言>c/c++

    c++类对象数组初始化方式

     
        发布时间:2013-9-9  


        本文导语: 定义类:class EquipmentPiece { private: int IDNumber; public: EquipmentPiece(int IDNumber) : IDNumber(IDNumber) {}; };以下列出几种初始化的方法:一、对象数组int ID1, ID2, ID3; EquipmentPiece bestPieces[] = { EquipmentPiece(ID1), EquipmentPiece(ID2), EquipmentPiece(ID3) };...

    定义

    class EquipmentPiece {
    private:
    int IDNumber;
    public:
    EquipmentPiece(int IDNumber) : IDNumber(IDNumber) {};
    };

    以下列出几种初始化方法

    一、对象数组

    int ID1, ID2, ID3;
    EquipmentPiece bestPieces[] = { EquipmentPiece(ID1), EquipmentPiece(ID2), EquipmentPiece(ID3) };

    注意:

    EquipmentPiece bestPieces[10]; //no appropriate default constructor available
    EquipmentPiece *bestPieces = new EquipmentPiece[10]; //no appropriate default constructor available

    当然,如果你将构造函数参数全都设了默认值,以上两种写法也成功,如将类中构造函数修改如下:

    ...
    EquipmentPiece(int IDNumber = 0) : IDNumber(IDNumber) {};
    ...

    二、指针数组

    typedef EquipmentPiece* PEP; //PEP是个指向EquipmentPiece的指针
    PEP bestPieces[10]; //等同于 PEP *bestPieces = new PEP[10]; 
    //然后初始化
    for(int i = 0; i < 10; i++){
    bestPieces[i] = new EquipmentPiece( IDNumber );
    }

    注意:

     要记得将此数组所指的所有对象删除。如果忘了会产生资源泄露。还有就是该方法与对象数组相比需要额外内存用于存放指针。(过度使用内存 这一问题可以避免,见第三种方法)。

     当你定义了构造函数以后,默认的构造函数就不起作用了。所以类里边就没有默认的构造函数,即:没有没有参数的构造函数。所以PEP bestPieces[10]; 是错误的。

     所有构造函数都是在定义时候就调用,定义以后的调用就不叫初始化了,而是赋值

     实例代码如下:

    class R
    {
    public:
     R ( int r1, int r2) : R1(r1),R2(r2){}
    private:
     int R1, R2;
    };
    void main()
    {
    //初始化实例1
       vector< R*> r;
       for(int i=0; i<5; i++)
       r.push_back( new  R(i,i+1));
    //初始化实例2
       R *r[5];
       for ( int i=0; i<5; i++)
           r[i] = new R(i,i+1);
    //初始化实例3
       R r[] = {R(1,2), R(2,3), R(3,4)};
    }

    三、使用placement new定位new操作符

    方法是:先为此数组分配raw memory,然后使用"placement new"在这块内存上构造EquipmentPiece objects;

    //分配足够的raw memory,给一个预备容纳10个EquipmentPiece objects的数组使用
    void *rawMemory = operator new(10*sizeof(EquipmentPiece)); 
    //让bestPieces指向此内存,使这块内存被视为一个EquipmentPiece数组
    EquipmentPiece *bestPieces = reinterpret_cast<EquipmentPiece*>(rawMemory); 
    //利用"placement new"构造这块内存中的EquipmentPiece objects。
    int IDNumber = 0;
    for(int i = 0; i < 10; i++){
    new (&bestPieces[i]) EquipmentPiece( IDNumber );
    }

    注意:该方法维护比较困难。在数组内对象结束生命时,要以手动方式调用destructors,最后还得调用operator delete释放raw memory。

    //将bestPieces中对象以构造次序的反序析构掉
    for(i = 0; i < 10; i++){
    bestPieces[i].~EquipmentPiece();
    }
    //释放raw memory
    operator delete (rawMemory);


    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:c++类对象数组初始化方式
    相关文章推荐:


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3