Почему мы не можем инициализировать элементы внутри структуры?

c struct initialization member

61091 просмотра

6 ответа

386 Репутация автора

Почему мы не можем инициализировать элементы внутри структуры?

пример:

struct s {
   int i = 10;
};
Автор: Santhosh Источник Размещён: 22.10.2008 10:01

Ответы (6)


38 плюса

60375 Репутация автора

Если вы хотите инициализировать нестатические элементы в struct объявлении :

В C ++ (не C) structsпочти синонимичны с классами и могут иметь члены, инициализированные в конструкторе.

struct s {
    int i;

    s(): i(10)
    {
    }
};

Если вы хотите инициализировать экземпляр :

В C или C ++:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99 также имеет функцию, называемую назначенными инициализаторами:

struct s {
    int i;
};

...

struct s s_instance = {
    .i = 10,
};

Существует также расширение GNU C, которое очень похоже на инициализаторы C99, но лучше использовать что-то более переносимое:

struct s s_instance = {
    i: 10,
};
Автор: Alex B Размещён: 22.10.2008 10:03

8 плюса

79215 Репутация автора

Изменить: Вопрос был помечен, c++но постер сказал, что это касается, cпоэтому я пометил вопрос, хотя я оставляю ответ ...

В C ++ это structпросто значение по classумолчанию, publicа не privateдля членов и наследования.

В C ++ static constвстроенные элементы допускаются только для встроенной инициализации, другие члены должны быть инициализированы в конструкторе или если structэто POD в списке инициализации (при объявлении переменной).

struct bad {
    static int answer = 42; // Error! not const
    const char* question = "what is life?"; // Error! not const or integral
};

struct good {
    static const int answer = 42; // OK
    const char* question;
    good() 
        : question("what is life?") // initialization list
        { }
};

struct pod { // plain old data
    int answer;
    const char* question;
};
pod p = { 42, "what is life?" };
Автор: Motti Размещён: 22.10.2008 10:05

34 плюса

599392 Репутация автора

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

struct s { int i=10; };

Это не объявляет какую-либо переменную - оно определяет тип. Чтобы объявить переменную, вы должны добавить имя между }и ;, а затем инициализировать его:

struct s { int i; } t = { 10 };

Как отметили Шекеры, в C99 вы также можете использовать назначенные инициализаторы (что является замечательным улучшением - однажды C догонит другие функции, которые Fortran 66 имел для инициализации данных, в основном повторяя инициализаторы определенное количество раз). С этой простой структурой нет никакой выгоды. Если у вас есть структура, скажем, с 20 членами, и вам нужно только инициализировать один из них (скажем, потому что у вас есть флаг, который указывает, что остальная часть структуры инициализирована или нет), это более полезно:

struct s { int i; } t = { .i = 10 };

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

Автор: Jonathan Leffler Размещён: 22.10.2008 03:14

2 плюса

51 Репутация автора

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

int a = 10;
  • если это автоматически, чем в памяти стека собирается выделить
  • если это глобально, чем в разделах данных память собирается выделить

Итак, какая память требуется для хранения этих данных, но в случае структуры нет памяти, поэтому невозможно инициализировать ее.

Автор: Anup Raj Dubey Размещён: 14.03.2016 06:14

13 плюса

131 Репутация автора

Обратите внимание, что в C ++ 11 теперь разрешено следующее объявление:

struct s {
   int i = 10;
};

Это старый вопрос, но он занимает высокое место в Google и может быть уточнен.

Автор: Turtlesoft Размещён: 31.05.2016 04:12

0 плюса

877 Репутация автора

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

Автор: Ajay Sivan Размещён: 31.05.2016 04:26
Вопросы из категории :
32x32