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

假设一个定义类的默认构造函数,然后构造这个类的对象数组将是一个问题。从而实现遗嘱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;
}

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

时间: 2024-10-20 02:00:45

没有默认构造函数,如何定义对象的数组的相关文章

javascript 构造函数方式定义对象 (转载)

javascript 构造函数方式定义对象 javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性 <html> <head> <script type="text/javascript"> /* //01.定义对象第一种方式 var object =new Object(); alert(object.username); //01.1增加属性username object["username&q

javascript 构造函数方式定义对象

javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性 <html> <head> <script type="text/javascript"> /* //01.定义对象第一种方式 var object =new Object(); alert(object.username); //01.1增加属性username object["username"]="liujianglo

合成的默认构造函数定义为delete的一种情况

1. 默认初始化 如果定义变量时没有指定初值,则变量会被默认初始化,此时变量被赋予了"默认值". 对于类类型的变量来说,初始化都是依靠构造函数来完成的.因此,即使定义某个类的变量(对象)时没有提供初始化式,我们也能通过类的默认构造函数来完成初始化.即,"默认值"由默认构造函数来决定(前提是该类有默认构造函数). 对于内置类型的变量来说,当定义没有初始化式的变量时,系统有时会帮我们初始化变量."默认值"由定义的位置决定:定义于任何函数体之外的变量被

【C++】默认构造函数

参考文献: 1.黄邦勇帅 2.http://www.cnblogs.com/graphics/archive/2012/10/02/2710340.html 3.http://blog.csdn.net/pnhuangyu/article/details/12352073 分三个部分: 一.基础 二.什么时候需要默认构造函数 三.默认构造函数将成员初始化为了什么值 一.基础 1.没有参数的构造函数是默认构造函数,默认构造函数只有一个. 2.如果用户没有自己声明构造函数,C++将提供一个默认的构造

C++默认构造函数

C++ primer中的三个地方讲解了默认构造函数: P44变量初始化规则 P227函数(构造函数) P388类(构造函数初始化式) 一, 变量初始化规则(P44和P227) 1,对于类类型的成员,调用该成员所属类自身的默认构造函数实现初始化. 2,内置类型成员的初值依赖于对象定义的位置,如果对象在全局作用域中定义(既不在任何函数中)或定义为静态局部对象,则这些成员将被初始化为0: 3,如果对象在局部作用域中定义,则这些成员没有初始化! 二,初始化列表 由P49和P50可知:const和引用类型

C++默认构造函数的问题

C++ defaul construct :缺省构造函数(默认构造函数) 定义:第一种   构造函数没有参数,即是 A()形式的 第二种   构造函数的全部参数由缺省值提供,A(int a=0,int b=0) 编译器添加的默认构造函数的条件:   如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做(这只是一种情况而言,此构造函数是trival 派生类和基类的关系: 我们通常说的派生类和基类,我们调用派生类的自定义的构造函数的时候,派生类会自动调用基类中

JavaScript中定义对象的四种方式 2012-5-10 15:19 阅读(0)

最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂方法来定义对象,但考虑到其简单性及非正规性,这里就不做介绍.和 Java 这样的面向对象语言相比, JavaScript 更像是函数式语言,其并没有类的概念,盖之以对象定义的概念,而具体创建的对象叫做对象的实例. 1)构造函数方式定义对象. 这种方式是在构造函数内定义属性和方法.这里举个简单的例子: func

JavaScript中定义对象的四种方式

最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂方法来定义对象,但考虑到其简单性及非正规性,这里就不做介绍.和 Java 这样的面向对象语言相比, JavaScript 更像是函数式语言,其并没有类的概念,盖之以对象定义的概念,而具体创建的对象叫做对象的实例.     1)构造函数方式定义对象. 这种方式是在构造函数内定义属性和方法.这里举个简单的例子:

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

如果一个类没有定义默认构造函数,那么构造该类的对象数组将会是一个问题.于是实现了一个将new操作符掰开了来用的代码.首先分配内存,然后再在分配的内存上调用构造函数构造对象,下面的代码做一个简单的备忘. //没有定义构造函数的类不能定义该类的对象数组,内置类型除外 //operator new + ctor //dtor + operator delete //operator new[] + ctor //dtor + operator delete [] #include <bits/stdc