Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
#1

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

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

Добрый день, сразу к делу, есть некий класс
C++
1
2
3
4
5
6
7
class some
{
  int x;
public:
  some(int y = 1) : x(y)
  {}
};
Будет ли определен компилятором конструктор по умолчанию (тот, что инициализирует поле x некорректным значением)?
Или вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2015, 15:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? (C++):

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

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

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

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

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

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

24
Nick Alte
Эксперт С++
1646 / 1018 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.07.2015, 15:34 #2
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию
В хорошо сформулированном вопросе заложен ответ.
Да, значение параметра по умолчанию позволяет этому конструктору выступать в качестве конструктора по умолчанию. А отсутствие ключевого слова explicit - ещё и в качестве оператора неявного преобразования из int.
1
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
22.07.2015, 15:35 #3
...
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию
0
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 15:46  [ТС] #4
Nick Alte, castaway, а в таком классе будет создан конструктор по умолчанию?
C++
1
2
3
4
5
6
7
class some
{
  int x;
public:
  some(int y) : x(y)
  {}
};
Просто смущает такая цитата из книги Дейтелов, что при создании одного или нескольких конструкторов, имеющих аргументы, компилятор не будет создавать конструктор по умолчанию. Подумал, что опечатка, вот и спрашиваю.
0
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
22.07.2015, 15:48 #5
А еще можно запустить программу и проверить, что он тебе сконструирует.
0
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 15:49  [ТС] #6
Цитата Сообщение от Nick Alte Посмотреть сообщение
А отсутствие ключевого слова explicit - ещё и в качестве оператора неявного преобразования из int.
Может в int?

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

Добавлено через 46 секунд
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Может в int?
Нет, у меня всё правильно написано. Преобразование будет из int в some.
0
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 15:55  [ТС] #8
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
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
22.07.2015, 15:59 #9
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор.

Добавлено через 2 минуты
Ferrari F1, связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов и деструктора (для правильного высвобождения памяти)
0
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 16:02  [ТС] #10
Eraston, я знаю, каковы правила хорошего стиля прогаммирования, сейчас же меня интересуют ответы на заданные ранее вопросы.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
22.07.2015, 16:07 #11
Цитата Сообщение от 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
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
22.07.2015, 16:07 #12
Цитата Сообщение от Eraston Посмотреть сообщение
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор потому, что они НЕ создаются компилятором потому, что это связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов (для правильного выделения памяти) и деструктора (для правильного высвобождения памяти)
Скомпилировал.
0
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 16:12  [ТС] #13
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
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
22.07.2015, 16:16 #14
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Это просто не скомпилируется.
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
22.07.2015, 16:17 #15
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Будет ошибка компиляции. Нет конструктора по умолчанию.
0
22.07.2015, 16:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2015, 16:17
Привет! Вот еще темы с ответами:

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

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

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

Конструктор Шредингера "нет подходящего конструктора по умолчанию", хотя он есть - C++
собственно, код. на 156-й строке ( cont(circi);) ругается на отсутствие конструктора в классе. но он там есть! я его видел! а если...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru