2013-09-25 133 views
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; 
} 

輸出:

 
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 

這裏的構造函數被調用三個時間和內存地址是相同的,意味着它不分配新的內存,並使用相同的地址。爲什麼?

爲什麼構造函數調用多次?

回答

1

當你這樣做:

demo[i]= i; 

i用於使用這需要一個int的構造函數來構造一個臨時對象。然後將此臨時分配給demo[i]。該作業不會導致demo[i]被重建爲具有不同地址的新對象(對象不能被重建,並且永遠不能改變他們的地址),它僅僅導致從臨時成員向成員demo[i](除非你提供了一個賦值操作符,它可以完成不同的操作,而你並沒有這樣做)。

+0

這意味着所有這三個時間稱爲contructer被其他物體(臨時對象)調用。是嗎?? – user2814127

+0

@ user2814127:除第一組以外的所有內容。 –

+0

你想說什麼。我不明白.. – user2814127

1

認爲構造函數爲你的對象分配內存是一個根本的誤解。當調用構造函數時,您已經分配了內存,不管是在堆棧上還是在堆上。構造函數只准備這個內存以後使用它。

然而,構造往往是負責爲您的對象所使用的資源分配進一步內存,即

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

這意味着你所說的構造函數可以被多次調用。第一次調用將分配內存和其他調用將使用該內存..我是嗎? – user2814127

+0

沒有。這意味着分配內存和調用構造函數是運行時在創建對象時相互執行的兩個獨立操作。事實上,你可以使用placement new來解耦它:'void * ptr = new char [sizeof(Demo)]; new(ptr)Demo;'(參見http://stackoverflow.com/questions/222557/what-uses-are-there-for-placement-new)。 – filmor

相關問題