Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29

Почему конструктор по умолчанию не обнуляет данные класса?

09.02.2020, 16:40. Показов 2439. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Никак не могу понять, почему вместо 0, 0 (объект pt1) конструктор по умолчанию выводит -858993460, -858993460 ?
Я пробовал не писать никаких конструкторов, но, даже в таком случае, конструктор по умолчанию, добавляемый компилятором автоматически, все равно выводит -858993460, вместо 0, в чем ошибка?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using std::cout;
using std::endl;
 
class Point {
private:
       int x, y;
public:
       Point() {}
       Point(int new_x, int new_y) {set(new_x, new_y);}
       void set(int new_x, int new_y);
       int get_x() {return x;}
       int get_y() {return y;}
};
 
int main() {
    Point pt1;
    Point pt2(5, 10);
 
    cout << "The value of pt1 is ";
    cout << pt1.get_x() << ", ";
    cout << pt1.get_y() << endl;
 
    cout << "The value of pt2 is ";
    cout << pt2.get_x() << ", ";
    cout << pt2.get_y() << endl << endl;
 
    system("pause");
    return 0;
}
 
void Point::set(int new_x, int new_y) {
     if (new_x < 0)
         new_x *= -1;
     if (new_y < 0)
         new_y *= -1;
     x = new_x;
     y = new_y;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2020, 16:40
Ответы с готовыми решениями:

Конструктор класса не видит конструктор по умолчанию другого класса
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Для класса не существует конструктор по умолчанию
Ошибка (активно) E0291 для класса &quot;Apteka&quot; не существует конструктор по умолчанию Хотел посмотреть что у меня получается, а он ошибку...

Вопрос про конструктор класса по умолчанию
http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg Пункт первый не могу немного понять.Т.е получается,что всегда лучше создавать самому...

19
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
09.02.2020, 16:45
В c++ переменные по умолчанию ничем не инициализируются, они хранят тот мусор, который уже есть в памяти. Если нужно инициализировать нулями, конструктор по умолчанию должен это делать:
C++
1
2
3
4
Point() {
x=0;
y=0;
}
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.02.2020, 16:47
Лучший ответ Сообщение было отмечено mark как решение

Решение

Цитата Сообщение от mark Посмотреть сообщение
почему вместо 0, 0 (объект pt1) конструктор по умолчанию выводит -858993460, -858993460 ?
Потому, что данные никто явно не проинициализировал.
Цитата Сообщение от mark Посмотреть сообщение
Я пробовал не писать никаких конструкторов, но даже в таком случае, конструктор по умолчанию, добавляемый компилятором автоматически, все равно выводит -858993460, вместо 0, в чем ошибка?
Компилятор не обязан ничего инициализировать нулем.

Добавлено через 1 минуту
Цитата Сообщение от elenayagubova Посмотреть сообщение
конструктор по умолчанию должен это делать
лучше воспользоваться списком инициализаций:
C++
1
Point() : x{0}, y{0} {}
1
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 17:01  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Компилятор не обязан ничего инициализировать нулем.
С этим понятно. Проясните тогда, пожалуйста, такой момент, если я правильно понимаю, то конструктор по умолчанию, добавляемый компилятором, устанавливает все данные-члены в ноль, а всем указателям присваиваются нулевые значения?

Цитата Сообщение от Azazel-San Посмотреть сообщение
Point() : x{0}, y{0} {}
Остановлюсь, пожалуй, на таком варианте:
C++
1
Point() {set(0,0);}
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
09.02.2020, 17:03
Цитата Сообщение от mark Посмотреть сообщение
если я правильно понимаю, то конструктор по умолчанию, добавляемый компилятором, устанавливает все данные-члены в ноль, а всем указателям присваиваются нулевые значения?
Нет. Он делает ровно то же, что ваш пустой конструктор, т.е. ничего
0
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 17:15  [ТС]
Цитата Сообщение от elenayagubova Посмотреть сообщение
Нет. Он делает ровно то же, что ваш пустой конструктор, т.е. ничего
Понятно, даже книжкам уже нельзя верить.. Вот прямо сейчас передо мной лежит книга, где черным по белому написано, цитирую: "Поведение конструктора по умолчанию , добавляемого компилятором, заключается в установке всех данных-членов в ноль, т.е. во все положения строки типа char помещаются нулевые байты, а всем указателям присваиваются нулевые значения.".
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.02.2020, 17:18
mark, Найдите страницу из книги в сети и прикрепите ссылку. Народ должен знать имя нашего героя!
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.02.2020, 17:25
Цитата Сообщение от mark Посмотреть сообщение
"Поведение конструктора по умолчанию , добавляемого компилятором, заключается в установке всех данных-членов в ноль, т.е. во все положения строки типа char помещаются нулевые байты, а всем указателям присваиваются нулевые значения."
Видимо автор имел ввиду такое:
C++
1
2
Point p; // default initialization
Point p = Point(); // value initialization
Если класс Point соответствует требованиям без user-provided constructor:
if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is called.
и с user-provided constructor:
if T is a (possibly cv-qualified) class type with a user-provided constructor, then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
Добавлено через 4 минуты
Цитата Сообщение от Azazel-San Посмотреть сообщение
Видимо автор имел ввиду такое:
Я о том, что возможно эта фраза вырвана из контекста. Назовите автора книжки и страницу.
0
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 17:30  [ТС]
Последний абзац. Автор: Оверленд Брайан.
Миниатюры
Почему конструктор по умолчанию не обнуляет данные класса?  
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.02.2020, 17:42
Цитата Сообщение от mark Посмотреть сообщение
Последний абзац. Автор: Оверленд Брайан.
У меня два варианта или в книжке рассматривается старый стандарт С++, т.е. С++98/03, или автор бредит.
Я не особый знаток старых стандартов, но вот что удалось найти:
Цитата Сообщение от C++03 8.5/5
To default-initialize an object of type T means:

— if T is a non-POD class type, the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);

— if T is an array type, each element is default-initialized;

otherwise, the object is zero-initialized.
Смотрим последний пункт.
В С++11 этот пункт был изменен:
Цитата Сообщение от N3337 8.5/6
To default-initialize an object of type T means:

— if T is a (possibly cv-qualified) class type, the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);

— if T is an array type, each element is default-initialized;

otherwise, no initialization is performed.
0
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 17:45  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Я о том, что возможно эта фраза вырвана из контекста. Назовите автора книжки и страницу.
Ну как из контекста.. далее он ЯСНО пишет: "Если в конструкторе нет инструкций, члены инициализируются значением 0."
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.02.2020, 17:47
Цитата Сообщение от Azazel-San Посмотреть сообщение
otherwise, the object is zero-initialized.
Но даже если так, отношения к compiler-provided constructor's это не имеет.
Т.к. к конструкторам сгенерированным компилятором никаких подобных требований нету, значит это относится именно к инициализации и только если объект POD.
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
09.02.2020, 17:50
Цитата Сообщение от mark Посмотреть сообщение
"Если в конструкторе нет инструкций, члены инициализируются значением 0."
Очень интересно, больше похоже, что
Цитата Сообщение от Azazel-San Посмотреть сообщение
автор бредит.
0
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 17:51  [ТС]
Читаем последний абзац.
Миниатюры
Почему конструктор по умолчанию не обнуляет данные класса?  
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.02.2020, 17:55
Цитата Сообщение от elenayagubova Посмотреть сообщение
больше похоже, что
Цитата Сообщение от mark Посмотреть сообщение
Читаем последний абзац.
Да, бред.

Берите нормальную книжку.
0
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 18:01  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Берите нормальную книжку.
А чтобы лично вы могли посоветовать из нормального? Желательно с основ ну и далее.. Собственно, от остальных участников беседы тоже хотелось бы услышать список хороших книг по С++!
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.02.2020, 18:10
Цитата Сообщение от mark Посмотреть сообщение
А чтобы лично вы могли посоветовать из нормального?
C++ Primer, 5th Edition
The C++ Programming Language, 4th Edition

Добавлено через 45 секунд
И еще вот Литература C++
0
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 18:21  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
C++ Primer, 5th Edition
The C++ Programming Language, 4th Edition
Цитата Сообщение от Azazel-San Посмотреть сообщение
И еще вот Литература C++
Спасибо! Еще небольшой вопрос, стоит ли концентрироваться на самом последнем стандарте, или достаточно, для начала, ну скажем С++11?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.02.2020, 18:34
Цитата Сообщение от mark Посмотреть сообщение
достаточно, для начала, ну скажем С++11
Да, С++11 вполне достаточно.
Потом постепенно С++14/17. Ну, вообще можете начинать учить и с более старого стандарта, тот же С++03, если хотите. Но сейчас де-факто уже почти везде С++11. Поэтому без явной на то надобности учить более старый наверное менее целесообразно.
1
1 / 1 / 0
Регистрация: 15.07.2007
Сообщений: 29
09.02.2020, 18:47  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Да, С++11 вполне достаточно.
Потом постепенно С++14/17. Ну, вообще можете начинать учить и с более старого стандарта, тот же С++03, если хотите. Но сейчас де-факто уже почти везде С++11. Поэтому без явной на то надобности учить более старый наверное менее целесообразно.
Ясно, еще раз, спасибо, вопрос решен, тему можно закрывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.02.2020, 18:47
Помогаю со студенческими работами здесь

Почему вызывается конструктор копий по умолчанию?
Всем добрый день! Не могу понять, почему не вызывается конструктор копий. Вот, для примера, код: class TestClass { public: ...

Cделать конструктор по умолчанию и копирования для класса
Вот у меня класс строка: class strg { char *str; int len; public: strg(); strg(const strg &amp;); }; реализация:

Конструктор класса по умолчанию: код компилируется, хотя по идее не должен
#include &lt;iostream&gt; class A {}; int main() { A i; A j(i); return 0;

Почему не работает следующий код из книги Страуструпа (конструктор значений по умолчанию)
#include&lt;iostream&gt; using namespace std; class Date { int a, b; static Date default_date; public: Date(int x = 0, int...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru