С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Ferrari F1
793 / 522 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
1

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

22.07.2015, 15:24. Просмотров 833. Ответов 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
Ответы с готовыми решениями:

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

Конструктор с параметром по умолчанию
Здравствуйте, знаю, что здесь про конструкторы много говорили, но я не смог...

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

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

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

24
Nick Alte
Эксперт С++
1648 / 1020 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.07.2015, 15:34 2
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию
В хорошо сформулированном вопросе заложен ответ.
Да, значение параметра по умолчанию позволяет этому конструктору выступать в качестве конструктора по умолчанию. А отсутствие ключевого слова explicit - ещё и в качестве оператора неявного преобразования из int.
1
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
22.07.2015, 15:35 3
...
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию
0
Ferrari F1
793 / 522 / 156
Регистрация: 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
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
22.07.2015, 15:48 5
А еще можно запустить программу и проверить, что он тебе сконструирует.
0
Ferrari F1
793 / 522 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 15:49  [ТС] 6
Цитата Сообщение от Nick Alte Посмотреть сообщение
А отсутствие ключевого слова explicit - ещё и в качестве оператора неявного преобразования из int.
Может в int?

Добавлено через 34 секунды
Eraston, сейчас нахожусь не дома, компиля под рукой нет, т.к. еду в поезде, читаю книгу)
0
Nick Alte
Эксперт С++
1648 / 1020 / 174
Регистрация: 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
793 / 522 / 156
Регистрация: 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
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
22.07.2015, 15:59 9
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор.

Добавлено через 2 минуты
Ferrari F1, связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов и деструктора (для правильного высвобождения памяти)
0
Ferrari F1
793 / 522 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 16:02  [ТС] 10
Eraston, я знаю, каковы правила хорошего стиля прогаммирования, сейчас же меня интересуют ответы на заданные ранее вопросы.
0
DrOffset
9017 / 4862 / 1198
Регистрация: 30.01.2014
Сообщений: 7,947
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
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 130
22.07.2015, 16:07 12
Цитата Сообщение от Eraston Посмотреть сообщение
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор потому, что они НЕ создаются компилятором потому, что это связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов (для правильного выделения памяти) и деструктора (для правильного высвобождения памяти)
Скомпилировал.
0
Ferrari F1
793 / 522 / 156
Регистрация: 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
9017 / 4862 / 1198
Регистрация: 30.01.2014
Сообщений: 7,947
22.07.2015, 16:16 14
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Это просто не скомпилируется.
0
Ilot
Эксперт С++
1832 / 1190 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
22.07.2015, 16:17 15
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Будет ошибка компиляции. Нет конструктора по умолчанию.
0
Ferrari F1
793 / 522 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 16:19  [ТС] 16
Ilot,
ааа, вот это я и хотел понять

А еще вопрос:
C++
1
2
some a(3);
some b = 1; // инициализация или присваивание? ведь выражение int x = 6; является иниц-ией
0
DrOffset
9017 / 4862 / 1198
Регистрация: 30.01.2014
Сообщений: 7,947
22.07.2015, 16:32 17
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
инициализация или присваивание?
Инициализация.
0
Nick Alte
Эксперт С++
1648 / 1020 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.07.2015, 16:34 18
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
инициализация или присваивание?
Говоря по-простому, инициализация. Если влезать в формальности, то здесь из единицы создаётся временный безымянный объект типа some, значение которого используется для инициализации b. Однако практически ненужные операции выбрасываются и получается такой же результат, как если написать попросту
C++
1
some b(1);
0
Ferrari F1
793 / 522 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
22.07.2015, 16:38  [ТС] 19
DrOffset, а в таком примере придется писать свой метод (не конструктор) для преобразования int в some?
C++
1
2
3
  some x;
  int y = 2;
  x = y;
0
DrOffset
9017 / 4862 / 1198
Регистрация: 30.01.2014
Сообщений: 7,947
22.07.2015, 16:46 20
Цитата Сообщение от 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
22.07.2015, 16:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2015, 16:46

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

Почему нельзя в конструкторе использовать параметр по умолчанию, если конструктор не встроен?
То есть честно говоря, вопрос так надо ставить: почему если конструктор...

Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу?
То есть вообще непонятно ничё, вот, смотрите, этот пример не компилится:...


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

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

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