typedef struct: инициализация по умолчанию

typedef struct foo
{
    bool my_bool;
    int my_int;
} foo;

в приведенном выше примере я понимаю, что my_bool будет инициализирован случайным образом либо true, либо false, но как насчет my_int? Я предполагал, что my_int будет по умолчанию инициализировано 0, но это, похоже, не так.

определение структур таким образом кажется несовместимым со списками инициализации, поэтому каков наилучший способ инициализации my_bool и my_int false и 0 соответственно?

7 ответов


типы не "инициализирован". Только объекты какого-то типа инициализируется. Как и когда они инициализируются, зависит от того, как и где определен соответствующий объект. Вы не дали определения какому - либо объекту в своем вопросе, поэтому ваш вопрос сам по себе не имеет большого смысла-ему не хватает необходимого контекста.

например, если вы определяете статический объект типа foo

static foo foo_object; // zeros

он будет автоматически инициализирован нулем потому что все объекты со статической длительностью всегда автоматически инициализируются нулем.

если вы определяете автоматический объект типа foo без инициализатора он останется неинициализированным

void func()
{
   foo foo_object; // garbage
}

если вы определяете автоматический объект типа foo С агрегатной инициализации, он будет инициализирован в соответствии с этим инициализатора

void func()
{
   foo foo_object1 = { 1, 2 }; // initialized
   foo foo_object2 = {}; // initialized with zeros
}

если вы выделяете свой объект с new и не предоставляют инициализатор, он останется неинициализированный

foo *p = new foo; // garbage in `*p`

но если вы используете () инициализатор, он будет нулевым инициализирован

foo *p = new foo(); // zeros in `*p`

если вы создаете временный объект типа foo С помощью foo() expression, результат этого выражения будет нулевой инициализацией

bool b = foo().my_bool; // zero
int i = foo().my_int; // zero

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


во-первых, способ объявления структуры в стиле C. В C++ вы должны просто сделать:

struct foo 
{
    bool my_bool;
    int my_int;
};

в C и c++ инициализация является отдельным шагом от выделения. Если вы всегда хотите инициализировать члены своей структуры, используйте синтаксис инициализации по умолчанию следующим образом:

struct foo
{
    bool my_bool{};
    bool my_int{};
};

в старых версиях c++ вам нужно вручную написать конструктор по умолчанию, который инициализирует все члены (новый синтаксис выше-это просто сахар для это):

struct foo 
{
    foo() : my_bool(), my_int() { }
    bool my_bool;
    int my_int;
};

как отмечает @sbi, если вы хотите вручную инициализировать структуру, даже без конструктора по умолчанию, вы можете сделать foo myFoo = foo();


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

typedef struct foo 
{ 
    foo()
    : my_bool(false), my_int(0)
    {
        // Do nothing
    }
    bool my_bool; 
    int my_int; 
} foo; 

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

struct foo {
    foo() : my_bool(false), my_int(0) {}
    bool my_bool;
    int  my_int;
};

вы не создаете любой


пока вы объявляете структуры в C-образе, вы можете использовать zeromemory для null точно sizeof(foo) байт, поэтому по умолчанию все значения 0.

В C++ вы можете определить свою структуру с помощью конструктора, который при необходимости установит для ваших значений некоторые значения по умолчанию.


c и c++ вообще не инициализируют переменные. Они содержат все, что было в том месте памяти, в котором они сейчас находятся. Это также относится к переменным-членам в классах и структурах, если вы специально не инициализируете их значением.