c++ - 构造函数调用分配内存?

标签 c++

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

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

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

输出:

Default contructor called
Default contructor called
Default contructor called
Default contructor called
Default contructor called

First time
Addresses are 

0x8281008
0x828100c
0x8281010
0x8281014
0x8281018

first time assigning values
Parameter contructor called
Parameter contructor called
Parameter contructor called
Parameter contructor called
Parameter contructor called


After first assignment
Addresses are 

0x8281008
0x828100c
0x8281010
0x8281014
0x8281018

Second time assigning values
Parameter contructor called
Parameter contructor called
Parameter contructor called
Parameter contructor called
Parameter contructor called

 After Second assignment
Addresses are 

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

i = 6

i = 7

i = 8

i = 9

这里的构造函数被调用了三次,内存地址都是一样的,说明不是分配新内存,而是使用同一个地址。为什么?

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

最佳答案

当你这样做时:

demo[i]= i;

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

关于c++ - 构造函数调用分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18999617/

相关文章:

c++ - 如何绕过在 Windows 上使用 zip (gz) 支持单独构建 Boost.Iostream?

C++调用对象 'int'不是函数也不是函数指针

c++ - 我们如何预测以下 C++ 程序的输出

c++ - 使用 boost::lexical_cast<double>(string)

android - cpp文件的armeabi-v7a编译错误

c++ - 当属性位置 != 0 时,着色器不输出任何内容

c++ - 复制 std::tuple

c++ - 多重继承导致的“无法访问的直接基础”

c++ - 是否可以限制 DLL 功能?

c++ - 为什么模板只能在头文件中实现?