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

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

22.07.2015, 15:24. Показов 3169. Ответов 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,818
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,818
22.07.2015, 16:16
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Это просто не скомпилируется.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,649
Записей в блоге: 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,818
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,818
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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru