0 / 0 / 4
Регистрация: 09.04.2016
Сообщений: 128
|
|||||||||||
1 | |||||||||||
Конструктор копирования в С++25.06.2018, 22:00. Показов 2132. Ответов 22
Метки нет Все метки)
(
Такой вопрос, работает ли такой синтаксис, если я передаю указатель на объект, а не объект?
0
|
|
25.06.2018, 22:00 | |
Ответы с готовыми решениями:
22
Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования Конструктор класса, конструктор копирования запускается не тот который нужен Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику Конструктор инициализации, конструктор копирования, деструктор |
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
25.06.2018, 22:33 | 2 |
он так и пишется. И это не указатель на объект, а константная ссылка
а чем это лучше? а вдруг nullptr подпихнут?
0
|
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
|
|
26.06.2018, 00:17 | 4 |
0
|
Комп_Оратор)
![]() |
||||||
26.06.2018, 01:35 | 6 | |||||
нужно объяснить компилятору. Конструктор копирования ищется по сигнатуре и нужен при различных случаях, таких как передача/возврат, например.
0
|
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
|
|
26.06.2018, 01:47 | 7 |
IGPIGP, только вот в твоём коде
&ra!=nullptr А вот A& ref = *((A)nullptr); уже UB и сегфолт зачастую. А значит, в мало-мальско сносном коде ссылка точно никогда не будет указывать на nullptr, о чём писали выше.Добавлено через 3 минуты shmkv, твой код — UB, такого не должно быть. А вот то, что в указателе может быть nullptr, стандартом допускается.
0
|
26.06.2018, 03:56 | 8 | |||||
Никакой null в конструктор не пропихнули. Ошибка появляется ДО его пропихивания.
во второй строчке вообще два разных действия. Сначала происходит UB когда ломается с UB вычисление выражения в скобках, потом идёт собственно вызов, который не ответственнен за поломку. Не по теме: потом идёт - некорректно так говорить, но смысл ясен всё равно что обвинить автора функции foo в том, что не предусмотрел ошибку с отрицательным значением аргумента
0
|
Комп_Оратор)
![]() |
||||||
26.06.2018, 09:39 | 9 | |||||
Конечно. Только
nullptr переданный с указателем это меньшее из зол. Такой указатель нельзя разыменовывать, но можно проверить на равенство nullptr . А вот указатель инициализированный чем попало или содержащий невалидный адрес проверить, мягко говоря, также просто как и дохлую ссылку. Моя реплика была не о nullptr , а о том, что безопасность ссылки по сравнению с указателем несколько преувиличена. И главное, не имеет отношения к теме о конструкторах копирования.Кроме всего. Если вы так уж хотите буквальных и не требующих размышлений ответов то извольте:
nullptr . Но и указатель который содержит значение nullptr тоже неизвестно куда указывает. Главное, что адрес не валиден.
0
|
![]() 8720 / 4300 / 958
Регистрация: 15.11.2014
Сообщений: 9,744
|
|
26.06.2018, 10:23 | 10 |
функция, которая по смыслу должна принимать
только живой валидный объект не должна допускать даже намёка на то, что объект может быть не валиден. такая функция принимает по ссылке, закладываясь, что ссылка априори валидная. ситуация, когда функции, которая ожидает валидный обьект, а ей скормили инвалида - программная ошибка в логике. в этом случае нужно дебажить/править код, а не изобретать костыли аля проверки указателя на нуль. зы: ошибок с протухшими указателями больше, чем с протухшими ссылками
0
|
Комп_Оратор)
![]() |
|
26.06.2018, 12:09 | 11 |
Кто же спорит? Однако, сигнатура конструктора копии (не перемещающего, а то совсем утонем), это контракт вшитый в язык. То что, в этом была какая-то логика (надеть подгузники на взрослых мужиков и получить невозможность отложенной инициализации с последствиями в виде невозможности создания массивов ссылое например) это бесспорно. Но вопрос топика:
И ответ - не лучше, потому, что это просто, не будет работать как конструктор копии. Может я не понял вопрос?
0
|
1369 / 513 / 71
Регистрация: 21.07.2015
Сообщений: 1,298
|
|
26.06.2018, 12:18 | 12 |
А разыменование нулевого указателя в коде функции не UB? Или будем обсуждать какое UB более UB? На практике мне приходится разбирать больше число дампов как с невалидными указателями, так и с ссылками. Но ссылки все же предпочтительнее т. к. могут защитить от неправильного использования. Но от ошибок в логике никакой защиты они не дают.
Добавлено через 2 минуты Весьма громкое заявление. Добавлено через 3 минуты Даже объяснять лениво, да и, видимо, бесполезно. IGPIGP вижу попытался.
1
|
![]() 8720 / 4300 / 958
Регистрация: 15.11.2014
Сообщений: 9,744
|
|
26.06.2018, 12:18 | 13 |
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
26.06.2018, 12:28 | 14 |
Прелесть конструктора копирования в том, что он используется в стандартной библиотеке для работы с контейнерами. Также с ним работают некоторые оптимизации компилятора.
Определить конструктор для указателя можно, но возможно, стоит просто разыменовывать указатель перед передачей в конструктор.
0
|
Комп_Оратор)
![]() |
||||||
26.06.2018, 12:40 | 15 | |||||
Он вообще говоря в функциях используется, а так же при явном вызове копирования. В том числе при инициализации присваиванием. Прелестей у него много.
А вот у константной ссылки есть прелесть которая позволяет передавать объекты на которые нельзя взять адрес. В этом их преимущество и... ржавый и гнутый гвоздь:
![]()
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
26.06.2018, 12:49 | 16 |
Хорошее замечание. Конструктор копирования может работать с временными объектами без черной магии, в отличи от конструктора с параметром-указателем.
1
|
Комп_Оратор)
![]() |
|
26.06.2018, 13:21 | 17 |
А указатели с ними просто не работают. Вне зависимости от магии неявных преобразований, вызываемой ссылками на приведения. Но я имел ввиду не это. Я имел ввиду тот простой факт, что передача указателя гарантирует отсутствие исключения на вызываемой стороне, вызванного конструированием (бошенного из конструктора).
1
|
Неэпический
|
||||||
26.06.2018, 14:20 | 18 | |||||
![]() РешениеЭто уже не будет являться конструктором копирования. Конструктор копирования - это конструктор у которого первый параметр lvalue-ссылка на объект этого же класса, а остальные параметры заданы по-умолчанию, либо отсутствуют. То есть для типа Some , конструктор копирования может выглядеть как-то так так:
2
|
0 / 0 / 4
Регистрация: 09.04.2016
Сообщений: 128
|
|||||||||||
26.06.2018, 15:42 [ТС] | 19 | ||||||||||
То-есть если у меня есть класс Class и конструктор
Class *class2; Я могу вызвать Class(class1); и Class(class2); и получу одно и тоже? Извиняюсь, уже понял, просто мой первый ооп язык - java, ещё не привык Там он скорее такой
0
|
1369 / 513 / 71
Регистрация: 21.07.2015
Сообщений: 1,298
|
|
26.06.2018, 15:53 | 20 |
Второй вариант вообще не скомпилируется.
Добавлено через 37 секунд Согласен, но с этого и началось обсуждение.
1
|
26.06.2018, 15:53 | |
Помогаю со студенческими работами здесь
20
Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор Конструктор копирования Конструктор копирования Конструктор копирования Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |