Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?

22.07.2015, 15:24. Показов 3104. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, сразу к делу, есть некий класс
C++
1
2
3
4
5
6
7
class some
{
  int x;
public:
  some(int y = 1) : x(y)
  {}
};
Будет ли определен компилятором конструктор по умолчанию (тот, что инициализирует поле x некорректным значением)?
Или вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2015, 15:24
Ответы с готовыми решениями:

Конструктор копирования кидает исключение, если копируют объект, созданные дефолтным конструктором
Привет! Вопрос из области философии - наткнулся на такое поведение при работе с IBPP (С++ клиент для работы с Firebird. Firebird - это...

Конструктор с параметром по умолчанию
Здравствуйте, знаю, что здесь про конструкторы много говорили, но я не смог решить свою проблему поэтому обращаюсь (хотя мне кажется что...

Задача на классы, конструктор с параметром и по умолчанию
Скомпилировал, запустил. Добавляю новые элементы... и все. Программа прекращает свою работу, окно закрывается. Этапы вывода новых...

24
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.07.2015, 15:34
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию
В хорошо сформулированном вопросе заложен ответ.
Да, значение параметра по умолчанию позволяет этому конструктору выступать в качестве конструктора по умолчанию. А отсутствие ключевого слова explicit - ещё и в качестве оператора неявного преобразования из int.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.07.2015, 15:35
...
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
22.07.2015, 15:46  [ТС]
Nick Alte, castaway, а в таком классе будет создан конструктор по умолчанию?
C++
1
2
3
4
5
6
7
class some
{
  int x;
public:
  some(int y) : x(y)
  {}
};
Просто смущает такая цитата из книги Дейтелов, что при создании одного или нескольких конструкторов, имеющих аргументы, компилятор не будет создавать конструктор по умолчанию. Подумал, что опечатка, вот и спрашиваю.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
22.07.2015, 15:48
А еще можно запустить программу и проверить, что он тебе сконструирует.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
22.07.2015, 15:49  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
А отсутствие ключевого слова explicit - ещё и в качестве оператора неявного преобразования из int.
Может в int?

Добавлено через 34 секунды
Eraston, сейчас нахожусь не дома, компиля под рукой нет, т.к. еду в поезде, читаю книгу)
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.07.2015, 15:50
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
а в таком классе будет создан конструктор по умолчанию?
И в таком тоже не будет.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Просто смущает такая цитата из книги Дейтелов, что при создании одного или нескольких конструкторов, имеющих аргументы, компилятор не будет создавать конструктор по умолчанию.
Всё правильно. Не будет.

Добавлено через 46 секунд
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Может в int?
Нет, у меня всё правильно написано. Преобразование будет из int в some.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
22.07.2015, 15:55  [ТС]
Nick Alte, то есть произойдет ошибка компиляции, раз конструктор по умолч. не будет создан?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class some
{
  int x;
public:
  some(int y) : x(y)
  {}
};
 
int main()
{
  some z;
  return 0;
}
а при

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class some
{
  int x;
public:
  some(int y = 1) : x(y)
  {}
};
 
int main()
{
 int z;
 return 0;
}
произойдет преобразование к some?
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
22.07.2015, 15:59
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор.

Добавлено через 2 минуты
Ferrari F1, связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов и деструктора (для правильного высвобождения памяти)
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
22.07.2015, 16:02  [ТС]
Eraston, я знаю, каковы правила хорошего стиля прогаммирования, сейчас же меня интересуют ответы на заданные ранее вопросы.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.07.2015, 16:07
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
то есть произойдет ошибка компиляции, раз конструктор по умолч. не будет создан?
Он именно компилятором не будет создан в обоих случаях.
Просто в первом случае конструктор по умолчанию не создал никто, ни компилятор (из-за наличия пользовательского конструктора), ни пользователь, т.к. не написал конструктор по умолчанию.
А во втором случае, компилятор по прежнему ничего не создавал, зато пользователь сделал конструктор по умолчанию самостоятельно (путем задания дефолтового значения единственному параметру).
Т.е. в книге все верно написано.

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
произойдет преобразование к some?
Вот так произойдет:
C++
1
2
3
4
Some a = 1; // rvalue int->some
 
int v = 2;
Some b = v; // lvalue int->some
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
22.07.2015, 16:07
Цитата Сообщение от Eraston Посмотреть сообщение
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор потому, что они НЕ создаются компилятором потому, что это связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов (для правильного выделения памяти) и деструктора (для правильного высвобождения памяти)
Скомпилировал.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
22.07.2015, 16:12  [ТС]
DrOffset, Eraston, а при

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class some
{
  int x;
public:
  some(int y) : x(y)
  {}
};
 
int main()
{
  some z;
  return 0;
}
z.x чему будет равнятся? некорректному значению?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.07.2015, 16:16
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Это просто не скомпилируется.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
22.07.2015, 16:17
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Будет ошибка компиляции. Нет конструктора по умолчанию.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
22.07.2015, 16:19  [ТС]
Ilot,
ааа, вот это я и хотел понять

А еще вопрос:
C++
1
2
some a(3);
some b = 1; // инициализация или присваивание? ведь выражение int x = 6; является иниц-ией
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.07.2015, 16:32
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
инициализация или присваивание?
Инициализация.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.07.2015, 16:34
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
инициализация или присваивание?
Говоря по-простому, инициализация. Если влезать в формальности, то здесь из единицы создаётся временный безымянный объект типа some, значение которого используется для инициализации b. Однако практически ненужные операции выбрасываются и получается такой же результат, как если написать попросту
C++
1
some b(1);
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
22.07.2015, 16:38  [ТС]
DrOffset, а в таком примере придется писать свой метод (не конструктор) для преобразования int в some?
C++
1
2
3
  some x;
  int y = 2;
  x = y;
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.07.2015, 16:46
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
а в таком примере придется писать свой метод (не конструктор) для преобразования int в some?
Если конструктор с аргументов int не explicit, то нет. Будет неявное преобразование к some через конструктор, и вызов operator=(some const &).

Добавлено через 2 минуты
Либо можно сделать оператор присваивания, принимающий int. Это будет эффективней.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class some
{
public:
    some(int) {}
 
    some & operator=(int v)
    {
        return *this;
    }
};
 
int main()
{
    some a = 1;
 
    a = 2; // вызов operator=(int)
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2015, 16:46
Помогаю со студенческими работами здесь

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

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

Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу?
То есть вообще непонятно ничё, вот, смотрите, этот пример не компилится: #include <stdio.h> class fee { public: //Не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru