Почему мы не можем инициализировать элементы внутри структуры?
Пример:
struct s {
int i = 10;
};
Почему мы не можем инициализировать элементы внутри структуры?
Пример:
struct s {
int i = 10;
};
Если вы хотите инициализировать нестатические элементы в struct
declare:
В С++ (не C), structs
почти синонимичны классам и могут иметь элементы, инициализированные в конструкторе.
struct s {
int i;
s(): i(10)
{
}
};
Если вы хотите инициализировать экземпляр:
В 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,
};
Прямой ответ заключается в том, что определение структуры объявляет тип, а не переменную, которая может быть инициализирована. Ваш пример:
struct s { int i=10; };
Это не объявляет какую-либо переменную - она определяет тип. Чтобы объявить переменную, вы должны добавить имя между }
и ;
, а затем вы будете инициализировать его потом:
struct s { int i; } t = { 10 };
Как отмечали Checkers, на C99 вы также можете использовать назначенные инициализаторы (что является прекрасным улучшением - в один прекрасный день C догонит другие функции, которые Fortran 66 предоставил для инициализации данных, в первую очередь повторяя инициализаторы с определенным числом раз). С этой простой структурой нет никакой пользы. Если у вас есть структура с, скажем, 20 членами, и вам нужно только инициализировать один из них (скажем, потому что у вас есть флаг, указывающий, что остальная часть структуры инициализирована или нет), это более полезно:
struct s { int i; } t = { .i = 10 };
Эта нотация также может использоваться для инициализации союзов, чтобы выбрать, какой элемент объединения инициализирован.
Изменить: Вопрос был первоначально помечен c++
, но плакат сказал, что он относится к c
, поэтому я снова пометил вопрос, я оставляю ответ, хотя...
В С++ a struct
- это просто class
, для которого по умолчанию используется public
, а не private
для членов и наследования.
С++ допускает инициализацию интегральных элементов 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?" };
Обратите внимание, что в С++ 11 теперь разрешено следующее объявление:
struct s {
int i = 10;
};
Это старый вопрос, но он занимает высокое место в Google и может также быть прояснен.
Мы не можем инициализировать, потому что, когда мы объявляем какую-либо структуру, чем фактически то, что делаем, просто сообщайте компилятору об их присутствии. Если для этого не выделено выделение памяти, и если мы инициализируем элемент без памяти для этого. Обычно то, что происходит, когда мы инициализируем любую переменную, которая зависит от места, где мы объявили переменную компилятор, выделяем память для этой переменной.
int a = 10;
Итак, какая память требуется для хранения этих данных, но в случае структуры нет памяти, поэтому ее невозможно инициализировать.
Как вы сказали, это просто член, а не переменная. Когда вы объявляете переменную, компилятор также предоставляет пространство памяти для тех переменных, где вы можете поместить значения. В случае a элемента структуры компилятор не выделяет для него пространство памяти, поэтому вы не можете назначать значения членам структуры, если вы не создаете переменную этого типа структуры.