0

如果构造函数用于分配内存。

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

#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;
}

输出:

调用默认构造函数
调用默认构造函数
调用默认构造函数
调用默认构造函数
调用默认构造函数

第一次
地址是

0x8281008
0x828100c
0x8281010
0x8281014
0x8281018

第一次赋值
参数构造函数调用
参数构造函数调用
参数构造函数调用
参数构造函数调用
参数构造函数调用


第一次分配后
地址是

0x8281008
0x828100c
0x8281010
0x8281014
0x8281018

第二次赋值
参数构造函数调用
参数构造函数调用
参数构造函数调用
参数构造函数调用
参数构造函数调用

 第二次分配后
地址是

0x8281008
0x828100c
0x8281010
0x8281014
0x8281018
我 = 5

我 = 6

我 = 7

我 = 8

我 = 9

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

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

4

2 回答 2

1

当你这样做时:

demo[i]= i;

i用于使用采用 int 的构造函数来构造临时对象。然后将此临时分配给demo[i]. 分配不会导致demo[i]被重构为具有不同地址的新对象(对象不能被重构,并且永远不能改变它们的地址),它只会导致从临时成员到demo[i](除非你提供了一个赋值运算符,它做了一些不同的事情,而你没有这样做)。

于 2013-09-25T08:18:54.113 回答
1

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

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

class Container
{
public:
    Container()
        : ptr_(new int[5])
    {}
    // ...
private:
    int* ptr_;
}
于 2013-09-25T08:19:53.310 回答