Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
797 / 527 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
1

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

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

Добрый день, сразу к делу, есть некий класс
C++
1
2
3
4
5
6
7
class some
{
  int x;
public:
  some(int y = 1) : x(y)
  {}
};
Будет ли определен компилятором конструктор по умолчанию (тот, что инициализирует поле x некорректным значением)?
Или вызовется конструктор с одним аргументом и произойдет подстановка значения по умолчанию?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2015, 15:24
Ответы с готовыми решениями:

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

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

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

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

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

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

Добавлено через 46 секунд
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Может в int?
Нет, у меня всё правильно написано. Преобразование будет из int в some.
0
797 / 527 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 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
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 138
22.07.2015, 15:59 9
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор.

Добавлено через 2 минуты
Ferrari F1, связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов и деструктора (для правильного высвобождения памяти)
0
797 / 527 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
22.07.2015, 16:02  [ТС] 10
Eraston, я знаю, каковы правила хорошего стиля прогаммирования, сейчас же меня интересуют ответы на заданные ранее вопросы.
0
13462 / 7127 / 1710
Регистрация: 30.01.2014
Сообщений: 11,899
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
59 / 11 / 3
Регистрация: 09.09.2014
Сообщений: 138
22.07.2015, 16:07 12
Цитата Сообщение от Eraston Посмотреть сообщение
Ferrari F1, вообще, если вы описываете хоть один конструктор или деструктор, то вы автоматически должны самолично описать и конструктор по умолчанию, и конструктор копирования по умолчанию, и деструктор потому, что они НЕ создаются компилятором потому, что это связано с тем, что описание своих конструкторов подразумевает работу с указателями и иже с ними, соответственно, обязательно необходимо наличие свобственно-описанных конструкторов (для правильного выделения памяти) и деструктора (для правильного высвобождения памяти)
Скомпилировал.
0
797 / 527 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 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
13462 / 7127 / 1710
Регистрация: 30.01.2014
Сообщений: 11,899
22.07.2015, 16:16 14
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Это просто не скомпилируется.
0
Эксперт С++
1883 / 1231 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
22.07.2015, 16:17 15
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
z.x чему будет равнятся? некорректному значению?
Будет ошибка компиляции. Нет конструктора по умолчанию.
0
797 / 527 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
22.07.2015, 16:19  [ТС] 16
Ilot,
ааа, вот это я и хотел понять

А еще вопрос:
C++
1
2
some a(3);
some b = 1; // инициализация или присваивание? ведь выражение int x = 6; является иниц-ией
0
13462 / 7127 / 1710
Регистрация: 30.01.2014
Сообщений: 11,899
22.07.2015, 16:32 17
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
инициализация или присваивание?
Инициализация.
0
Эксперт С++
1659 / 1031 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.07.2015, 16:34 18
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
инициализация или присваивание?
Говоря по-простому, инициализация. Если влезать в формальности, то здесь из единицы создаётся временный безымянный объект типа some, значение которого используется для инициализации b. Однако практически ненужные операции выбрасываются и получается такой же результат, как если написать попросту
C++
1
some b(1);
0
797 / 527 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
22.07.2015, 16:38  [ТС] 19
DrOffset, а в таком примере придется писать свой метод (не конструктор) для преобразования int в some?
C++
1
2
3
  some x;
  int y = 2;
  x = y;
0
13462 / 7127 / 1710
Регистрация: 30.01.2014
Сообщений: 11,899
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2015, 16:46

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

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

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

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

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


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

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

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