powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация структуры
25 сообщений из 61, страница 1 из 3
инициализация структуры
    #34991823
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обнулить все поля структуры можно, вроде бы как, таким образом:
Код: plaintext
1.
st s = { 0 };
но
Код: plaintext
1.
st s({ 0 });
почему-то не работатет, почему?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992031
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще интересен сам механизм такой инициализации, как я понял, операторы присваивания при ней не вызываются, и происходит это после инициализации конструктором структуры.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992055
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще, интересно мнение спецов :), если в структуру включены объекты, то обнуление ее типа memset() как-то уже не совсем справедливо, это может нарушить состояние включенных объектов, которые могут инициализироваться не обязательно нулями для корректной работы.
Можно сделать в структуре инициализирующий конструктор, но тогда смысл считать ее структурой, не проще ли относиться к ней как классу. Т.е. где пролегает эта грань, между структурой и классом для правильного программирования?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992087
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TubrikИ еще, интересно мнение спецов :), если в структуру включены объекты, то обнуление ее типа memset() как-то уже не совсем справедливо, это может нарушить состояние включенных объектов, которые могут инициализироваться не обязательно нулями для корректной работы.

Не то что не совсем справедливо, а безобразие.

TubrikМожно сделать в структуре инициализирующий конструктор, но тогда смысл считать ее структурой, не проще ли относиться к ней как классу. Т.е. где пролегает эта грань, между структурой и классом для правильного программирования?

Баян, было несколько месяцев назад ищи.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992090
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
imho класс - объект, составляющие которого, как правило, логически связаны между собой, структура, же это (опять же ;) ) как правило, просто сборище друг от друга не зависящих объектов, с public доступом для всех и вся. Вообще, конечно, все на усмотрение разработчика...
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
инициализация структуры
    #34992114
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тынц

Кстати, сейчас начал склоняться к т/з Мастера Зива.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992124
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumimho класс - объект, составляющие которого, как правило, логически связаны между собой, структура, же это (опять же ;) ) как правило, просто сборище друг от друга не зависящих объектов, с public доступом для всех и вся. Вообще, конечно, все на усмотрение разработчика...

Сборище - это мусор, а не структура. ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992145
я предпочитаю чтобы структуры были POD
...
Рейтинг: 0 / 0
инициализация структуры
    #34992201
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимиря предпочитаю чтобы структуры были POD

Для агрегатной инициализации структура не обязательно должна быть POD, главное, чтобы у нее было конструкторов и еще кое-чего ;) :
автор 8.5.1 Aggregates [dcl.init.aggr]
An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or pro-
1
tected non-static data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct person_info
{
   std::string name;
   std::string female;
};

...

person_info person= {"Ivan", "Ivanov"}; // ok


...
Рейтинг: 0 / 0
инициализация структуры
    #34992215
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимиря предпочитаю чтобы структуры были POD согласен, короче: если структура не выходит за рамки С.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992234
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikобнулить все поля структуры можно, вроде бы как, таким образом:
Код: plaintext
1.
st s = { 0 };
но
Код: plaintext
1.
st s({ 0 });
почему-то не работатет, почему?

Для того чтобы корректно "обнулить" поля структуры мы опираемся на следующее утверждение стандарта:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 7   If there are fewer initializers in the list than there are members in the aggregate, then each member not
  explicitly initialized shall be value-initialized ( 8 . 5 ). [Example:
        struct S { int a; char* b; int c; };
        S ss = {  1 , "asdf" };
  initializes ss.a with  1 , ss.b with "asdf", and ss.c with the value of an expression of the form
  int(), that is,  0 . ]
 8   An initializer for an aggregate member that is an empty class shall have the form of an empty initializer-list
  {}. [Example:
        struct S { };
        struct A {
                    S s;
                    int i;
        } a = { { } ,  3  };
   —end example] An empty initializer-list can be used to initialize any aggregate. If the aggregate is not an
  empty class, then each member of the aggregate shall be initialized with a value of the form T() ( 5 . 2 . 3 ),
  where T represents the type of the uninitialized member.

Следовательно, если мы хотим просто "обнулить" структуру, то пишем:

Код: plaintext
1.
st s = {};

Только MS компиляторы (VC6 точно, остальные не знаю) не понимают empty initializer-list :(
...
Рейтинг: 0 / 0
инициализация структуры
    #34992244
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Голенков Владимиря предпочитаю чтобы структуры были POD согласен, короче: если структура не выходит за рамки С.

А зачем себя так ограничивать, в таком свободном языке как C++ ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992283
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik wrote:

> st s({0});
>
> почему-то не работатет, почему?
Конструктору присваивания в качестве параметра надо st& или const st&,
если конструктор не определен и используется дефолтный.

Тип выражения "{0}" неизвестен.

Компилиться будет вот так (g++, на msvc не факт, что будет):
Код: plaintext
1.
st s((st){ 0 }), мое

вопросы?
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация структуры
    #34992328
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :)
Либо полный С, либо полный С++/ООП. Третьего не дано.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992346
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :)
Либо полный С, либо полный С++/ООП. Третьего не дано.

"Это был системный аналитик. Он дал исчерпывающий ответ, из которого мы ничего полезного для себя почерпнуть не можем" :D
...
Рейтинг: 0 / 0
инициализация структуры
    #34992483
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выходит:
1. Для структуры не создается конструктор по-умолчанию, как и конструктор копирования.
1. Список инициализации работает только для структур, где нет явно созданного конструктора.
3. При отсутствии конструктора, для вложенных в структуру переменных классовых типов, их конструкторы все же вызываются.

Akh
Не то что не совсем справедливо, а безобразие.


а как тогда быстро и кратко обнулить структуру типа :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct stTest
{
	int a;
	double b;
	/*... 
	огромный список
	...*/
};

?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992487
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :)
Либо полный С, либо полный С++/ООП. Третьего не дано.
Борис, ты не ПРАВ!(с)
А вот создатели STL с вами были не согласны и наворотили такого из структур и классов..... Так что class == struct и никак не иначе
...
Рейтинг: 0 / 0
инициализация структуры
    #34992519
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наворотили – ну и флаг им в руки, кто это воротилово разгребать будет?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992533
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных
...
Рейтинг: 0 / 0
инициализация структуры
    #34992547
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoнаворотили – ну и флаг им в руки, кто это воротилово разгребать будет?
Да они свой флаг несут высоко и долго, многим бы так
А от того что ты считаешь что struct это POD, она не поменяет свой сущности.
Tubrik
просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных

Можно все что не запрещено и что не вводит в заблуждение. В данном случае ни того ни другого нет
...
Рейтинг: 0 / 0
инициализация структуры
    #34992561
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче) достал из завалов учебник, порывшись, все-таки оформил для себя понимание структуры исходя из след. двух принципов:

1. Структура является объединением простых переменных.
2. Класс является объединением данных и функция для работы над этими данными (ну и не только).

Сделал для себя правило:
1. Хранить в структуре только простые типы данных.
2. Даже не думать манипулировать любыми данными через структуру (т.е. никаких методов внутри).
3. п.1. позволяет беспечно использовать memset() и ему подобные.
4. Если есть необходимость постоянно однообразно изменять данные в структуре, сделать для этого специальную ф-ию.

Если кратко:
структура - это данные и ничего больше!

аж легче стало =)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992577
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikа как тогда быстро и кратко обнулить структуру типа :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct stTest
{
	int a;
	double b;
	/*... 
	огромный список
	...*/
};

?

Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше:

Код: plaintext
stTest s = {};
...
Рейтинг: 0 / 0
инициализация структуры
    #34992578
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и сразу же нарушил свое же правило, добавив в структуру поля std::string =)

в связи с чем внес поправку:

Структура - это объединение любых типов данных, без каких-либо возможных манипуляций над данными, как внутренними, так и внешними. (а чем там будут эти данные заниматься внутри структуры - это уже не ее проблемы)
Для повторяющихся обнулений и др. переинициализаций использовать внешние ф-ии.

Вроде все стыкуется, жаль только memset уже не применишь.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992581
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше:
Код: plaintext
stTest s = {};


нет, стараюсь читать внимательно, но я спросил "как обнулить", а не "инициализировать", вы таким образом можете обнулить ее в любом месте кода?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992592
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И снова мир поделился на остро- и тупоконечников. Аминь
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]