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

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

09.02.2020, 16:40. Показов 2382. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru