Конструкторы по умолчанию - PullRequest
1 голос
/ 26 октября 2010

Я знаю, что конструкторы по умолчанию инициализируют объекты их значениями по умолчанию, но как мы можем просмотреть эти значения?Если есть переменная типа int, она должна быть инициализирована равной 0. Но как мы на самом деле видим эти значения конструкторов по умолчанию?Кто-нибудь может предоставить фрагмент кода, чтобы продемонстрировать то же самое?

Ответы [ 8 ]

4 голосов
/ 26 октября 2010

Если не указано иное, объекты создаются с помощью конструктора по умолчанию, только если он доступен.

И, например, целые числа не инициализируются.

Это распространенный источник огромных проблем и ошибок, потому что он может иметь любое значение.

Таким образом, правило таково: всегда инициализируют переменные , а для класса вы делаете это в списке инициализации

class A
{
private:
    int i;
    float f;
    char * pC;
    MyObjectType myObject;
public:
    A() :   // the initialisation list is after the :
    i(0),
    f(2.5),
    pC(NULL),
    myObject("parameter_for_special_constructor")  
    {}
}

}

3 голосов
/ 26 октября 2010

В C ++ int не является class и не имеет конструктора по умолчанию (или любого другого).

Не гарантируется, что int будет инициализирован 0.

Если у вас есть class, который имеет int в качестве атрибута, вы должны явно инициализировать его вкаждый из конструкторов class (а не только конструктор по умолчанию).

class sample
{
private:
    int x;
public:
    sample()
        :x(0)
    {
    }

    sample(const int n)
        :x(n)
    {
    }

    sample(const sample& other)
        :x(other.x)
    {
    }

    // [...]
};

Таким образом, вы (и пользователи вашего класса) можете «просматривать» значения по умолчанию.

2 голосов
/ 26 октября 2010

Хорошая практика кодирования: напишите свой собственный конструктор, чтобы вы знали, как он будет инициализирован. Это портативно и гарантированно всегда будет иметь одинаковое поведение. Ваш код будет легче читать, и компилятор знает, как сделать это эффективным, особенно при использовании специальной записи:

class Foo
{
  public:
    Foo() : i(0), j(0) {}

  private:
    int i;
    int j;
};
1 голос
/ 26 октября 2010

AFAIK, если T является типом (не обязательно класс ), T() возвращает значение по умолчанию для типа T. Вот небольшой тест, который я выполнил:

int main()
{
    char c = char();
    int i  = int();

    cout << "c = " << hex << (int) c << endl;
    cout << "i = " << i << endl;
}

Вывод:

c = 0
i = 0
0 голосов
/ 26 октября 2010

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

0 голосов
/ 26 октября 2010

default constructor - это то, что может быть вызвано с 0 параметрами. Например

struct X
{
   X(int x = 3) //default constructor
   {
     //...
   }
};

Он инициализирует объект в зависимости от того, какой код вы его инициализируете. Тем не менее, если вы вообще не определяете конструктор , компилятор попытается сгенерировать конструктор по умолчанию для вас, что, в свою очередь, эквивалентно конструктору без аргументов и без тела. Это означает, что все члены класса / структуры типа будут инициализированы с их определением. ctors и все члены примитивных типов, таких как int, останутся неинициализированными. Обратите внимание, что я специально отметил, что компилятор попытается сгенерировать dflt ctor, потому что он может этого не сделать, например, когда один или несколько членов класса не имеют конструкторы по умолчанию. НТН

0 голосов
/ 26 октября 2010

покажи свой код

А если твое значение типа int является членом класса.вы должны дать ему значение в конструкторе по умолчанию func

0 голосов
/ 26 октября 2010

Конструкторы по умолчанию не инициализируют целые числа равными 0. Вы можете использовать скобки, чтобы указать значение по умолчанию.

struct X
{
   int x;
};

struct X x1; // x1.x is not necessarily 0

struct Y
{
   int y;
   Y() : y()
   {
   }
};

struct Y y1; // y1.y will be 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...