2015-04-21 7 views
0

Эта программа дает правильный результат, но я не могу понять, как это сделать. Как конструктор по умолчанию вызывается во время объявления объекта?Вызов конструктора по умолчанию

#include <iostream> 
using namespace std; 
class GuessMe { 
private: 
    int *p; 
public: 
    GuessMe(int x=0) 
    { 
     p = new int; 
    } 
    int GetX() 
    { 
     return *p; 
    } 
    void SetX(int x) 
    { 
     *p = x; 
    } 
    ~GuessMe() 
    { 
     delete p; 
    } 
}; 

int main() { 
    GuessMe g1; 
    g1.SetX(10); 
    GuessMe g2(g1); 
    cout << g2.GetX() << endl; 
    return 0; 
} 
+0

Вы правы. Код неправильный. Вы должны явно создать конструктор по умолчанию. –

+0

, но он дает правильный результат –

+0

Интересно, тогда –

ответ

5

Этот конструктор имеет параметр по умолчанию:

GuessMe(int x=0) 

Это означает, что, когда GuessMe по умолчанию строится, это как если бы она была вызвана с аргументом со значением 0. Обратите внимание, что параметр конструктора не используется ни для чего в вашем коде. Также отмечу, что p установлен, чтобы указать на неинициализированное целое здесь:

p = new int; 

GetX() поэтому вызова перед вызовом SetX() даст неопределенного поведения. Предположительный вы хотите использовать значение x установить p:

GuessMe(int x=0) 
{ 
    p = new int(x); 
} 

или, используя инициализацию вместо назначения,

GuessMe(int x=0) : p(new int(x)) 
{ 
} 

Также читайте на the rule of three, чтобы избежать двойных удалений. А затем научиться кодировать без сырых указателей на динамически выделенные объекты.

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