中的构造函数调用分配内存

Constructor in called for allocate memory?

本文关键字:分配 内存 函数调用      更新时间:2023-10-16

if 构造函数用于分配内存。

在下面的程序中,它不是那样工作的。看

#include <iostream>
using namespace std;
class Demo
{
    int i;
public:
    Demo()
    {
        cout<<"nDefault contructor called";
    }
    Demo(int x)
    {
        i = x;
        cout<<"nParameter contructor called";
    }
    void Display()
    {
        cout<<endl<<"i = "<<i<<endl;
    }
};
int main()
{
    Demo *demo = new Demo[5]; // = {1,2,3,4,5};
    int i;
    cout<<endl<<endl<<"First time";
    cout<<endl<<"Addresses are "<<endl;
    for( i=0;i<5; i++)
    {
        cout<<endl<< &demo[i];
    }
    cout<<endl<<endl<<"first time assigning values";    
    for( i=0;i<5; i++)
    {
        demo[i]= i;
    }
    cout<<endl<<endl<<"nAfter first assignment";
    cout<<endl<<"Addresses are "<<endl;
    for( i=0;i<5; i++)
    {
        cout<<endl<< &demo[i];
    }
    cout<<endl<<endl<<"Second time assigning values";    
    for( i=0;i<5; i++)
    {
        demo[i]= i+5;
    }
    cout<<endl<<endl<<" After Second assignment ";
    cout<<endl<<"Addresses are "<<endl;
    for( i=0;i<5; i++)
    {
        cout<<endl<< &demo[i];
    }
    for( i=0;i<5; i++)
    {
        demo[i].Display();
    }
    return 0;
}

输出:

调用的默认构造器调用的默认构造器调用的默认构造器调用的默认构造器调用的默认构造器第一次地址是0x82810080x828100c0x82810100x82810140x8281018首次分配值调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器第一次分配后地址是0x82810080x828100c0x82810100x82810140x8281018第二次赋值调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器调用的参数构造器 第二次分配后地址是0x82810080x828100c0x82810100x82810140x8281018i = 5i = 6i = 7i = 8i = 9

这里构造函数被调用三次,内存地址相同,这意味着它没有分配新的内存并使用相同的地址。为什么?

为什么多次调用构造函数?

当你这样做时:

demo[i]= i;

i 用于使用采用 int 的构造函数构造临时对象。 然后将此临时分配给demo[i] 。 赋值不会导致demo[i]被重建为具有不同地址的新对象(对象无法重建,并且永远无法更改其地址(,它只会导致从临时成员到demo[i]成员的成员赋值(除非您提供执行不同操作的赋值运算符, 你没有(。

认为构造函数为对象分配内存是一个根本性的误解。调用构造函数时,您已经在堆栈或堆上分配内存。构造函数仅准备此内存以供以后使用。

但是,构造函数通常负责为对象使用的资源分配更多的内存,即

class Container
{
public:
    Container()
        : ptr_(new int[5])
    {}
    // ...
private:
    int* ptr_;
}