• 没有默认构造函数,如何定义对象的数组


    假设一个定义类的默认构造函数,然后构造这个类的对象数组将是一个问题。从而实现遗嘱new运营商掰开使用代码。

    首先,分配内存,然后调用构造函数对象分配内存。的代码做一个简单的备忘。

    //未定义构造函数的类不能定义该类的对象数组,内置类型除外
    
    //operator new + ctor
    //dtor + operator delete 
    
    //operator new[] + ctor
    //dtor + operator delete []
    
    #include <bits/stdc++.h>
    using namespace std;
    
    class A
    {
    private:
        int x;
    public:
        A(int _x):x(_x){}
        ~A() {}
    };
    //未定义构造函数的类在定义数组的时候,会出现故障。!
    
    int main()
    {
        //A vecs[10];   //compile failed
        //Method 1: placement new
        void *raw = operator  new[] (3*sizeof(A));
        A *pa = static_cast<A *>(raw);
        for(int i = 0 ; i< 3;++i)
            new (&pa[i])A(i);     //placement new
    
        //destructor + deallocate
        for(int i = 0;  i< 3;++i)
            pa[i].~A(); //仅仅是在每一个位置处调用了析构函数,可是没有释放内存
        operator delete[](pa); //释放内存
        //delete [] pa;   //假设类A未定义构造函数。那么此句正确。可是一旦定义了构造函数就内存错误了。仅仅能通过operator delete来删除operator new分配的空间,见上一句
    
        
        //可是以下的方法与是否定义构造函数没有关系!!
        void *raw2 = operator new(sizeof(int));
        int *p = static_cast<int *>(raw2);
        new (p)int(3);
        cout << *p << endl;
        delete p;     //内置类型没有析构函数,直接delete就可以
    
        
        void *raw3 = operator new [] (sizeof(int)*3);
        int *pInts = static_cast<int *>(raw3);
        for(int i = 0 ; i < 3;++i)
          new (&(pInts[i]))int(i);  //placement new
    
        for(int i = 0 ; i < 3;++i)
          cout << pInts[i] << endl;
    
        operator delete []( pInts);
    
        return 0;
    }


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    C# SqlDataAdapter
    数据库游标
    什么是DooPHP Framework ?
    健康世界官方网站绿色健康知识门户网站源码www.jiankangshijie.com
    蓝色教程资讯、软件下载网站风格全套织梦模板
    分享一本正在看的电子书,相当不错
    DooPHP中国官方微博
    DooPHP Framework 中文手册 v1.2
    吉林织梦网络公司网站风格模板 www.thinkphp.biz
    CSS HACK:IE6、IE7、IE8、Firefox兼容性问题解决方案
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4688082.html
Copyright © 2020-2023  润新知