2016-04-25 2 views
1
#include<iostream> 
using namespace std; 
class Monster { 

    public: 
    Monster() {cout << "with out argument. \n";} 
    Monster(int sz) { cout << "Monster created.\n"; } 
    ~Monster() { cout << "Monster destroyed.\n"; } 

    int GetSize() { return itsSize; } 
    void SetSize(int str) { itsSize = str; } 

private: 
    int itsSize; 
}; 

int main() 
{ 
    Monster *m; 
    m =new Monster[3]; 
    for(int i = 0; i < 3; i++) 
    m[i] = i; // constructor with argument is getting called for each elements after which why destructor is getting called for each element.   
    delete []m; 
    return 0; 
} 

Output: 
with out argument. 
with out argument. 
with out argument. 
Monster created. // Monster constructor with argument is getting called. 
Monster destroyed. // 1. Why this destructor is getting called after each call of constructor. 
Monster created. 
Monster destroyed. //2. 
Monster created. 
Monster destroyed. //3. 
Monster destroyed. 
Monster destroyed. 
Monster destroyed. 

Когда я инициализирую объект Array of Monster со значением, вызывается вызываемый параметризованный конструктор, сразу же после чего возникает вызов деструктора?Как называется функция уничтожения?

+1

Вы должны аннотировать копию и переместить конструкторы (и назначения), а также получить более четкое изображение. Они дадут вам лучшее представление о временных и т. Д., Плавающих в коде. – Niall

+0

'm [i] = i;' вы храните целые числа в этом массиве указателей, это действительно то, что вы хотели? –

+0

Вот пример «шумного» «монстра» ... http://coliru.stacked-crooked.com/a/b8456e3bec85d185 – Niall

ответ

6
m =new Monster[3]; 

Здесь создаются три объекта, по умолчанию для каждого из них вызывается конструктор по умолчанию. Вот почему вы видите сообщения with out argument.

m[i] = i; 

Во-первых, временный монстр создается на правой руке на стороне, используя Monster(int) конструктор. Вот почему вы видите сообщение Monster created. Далее вызывается оператор присваивания. Затем ваш временный монстр будет удален. Вот почему вы видите Monster destroyed..

delete []m; 

Три монстра из массива уничтожены.


Чтобы лучше понять такие ситуации, я предлагаю вам добавить адрес this всех ваших сообщений.

+0

Ударьте меня к удару. ;) [live demo] (http://ideone.com/jeKMZZ) Временный объект, который был сконструирован, переносится в ваш массив, но временное само по-прежнему уничтожается. Перемещение-присваивание не перемещает сам объект, а только его владение ресурсами. –

Смежные вопросы