2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
|
||||||
1 | ||||||
оператор присваивания11.10.2010, 21:10. Просмотров 2147. Ответов 12
Метки нет Все метки)
(
Привет всем !
Каким образом вызывается оператор присваивания, например, здесь: Код
a = "I "; Может быть дело в operator char*(), но в ответе operator char() вызывается после присваивания: Компилятор выводит : Vizivaetsja operator prisvaivanija Vizivaetsja operator prisvaivanija Vizivaetsja operator prisvaivanija Vizvalsja operator char* ...
0
|
|
11.10.2010, 21:10 | |
Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * Оператор присваивания.
Оператор присваивания |
|
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
|
|||||||||||
12.10.2010, 02:42 [ТС] | 3 | ||||||||||
Прошу, если пишите, пишите подробней
Добавлено через 4 часа 5 минут
0
|
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
|
|||||||||||||||||||||
31.10.2010, 08:58 [ТС] | 4 | ||||||||||||||||||||
Почему в коде ниже вызывается конструктор копирования, а не оператор присваивания
Вообще есть правило, что если идет присваивание к уже существуемому объекту, то должен вызываться оператор присваивания пр
Теперь у меня возникает проблема, если следовать этом правилам, то почему у здесь
Если нужен код Fraction.h вот он
0
|
быдлокодер
1720 / 907 / 106
Регистрация: 04.06.2008
Сообщений: 5,623
|
|||||||||||||||||||||||||||||||||||||||||
31.10.2010, 13:15 | 5 | ||||||||||||||||||||||||||||||||||||||||
Давай с последним примером разбираться, я щас над ним тоже парюсь, у меня вопросы похожие.
1) Почему вызывается не оператор присваивания Ты наверное, имеешь ввиду этот код
"Функция оператора присваивания является специальной функцией, потому что компилятор сам её подставляет, если вы не делаете этого" Ну вроде пока всё понятно должно быть. Уточняй если что не так. 2) К тому же конструктор копирования действительно вызывается. Ты имеешь ввиду этот?
ситуации, когда вызывается конструктор копирования АВТОМАТИЧЕСКИ, то есть ты не прописываешь его вызов, а н вызывается 1) Когда возвращаемое значение имеет тип класса и так далее В даном случае add возвращает переменную типа Fraction, поэтому конструктор копирования всё-таки вызывается (и должен вызываться), хоть мы этого и не видим (автоматически то есть) Ну как-то так. Коряво. Добавлено через 3 минуты А, не я соврал чуток. Ты же не пишешь какой именно код ты имеешь ввиду приходится додумывать самому Итак. f3= f1+ f2 При возвращении add значения вызывается (наверное) вот это конструктор копирования:
Добавлено через 2 часа 29 минут Но что действительно удивляет, так это почему не вызывается это конструктор копирования
"Конструктор копирования вызывается, когда аргумент имеет тип класса" Это и есть тот случай Аргумент тут f2, он имеетр тип FloatFraction, а, посколку add с таким классом работать не может, его надо привести к типу Fraction Вот и должен автоматом вышеупомянутый конструктор вызываться. Так не вызывается! Пишем так:
В чём дело, друзья?
0
|
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
|
|||||||||||||||||||||
31.10.2010, 16:20 [ТС] | 6 | ||||||||||||||||||||
Принцип работы:
Добавлено через 10 минут
0
|
быдлокодер
1720 / 907 / 106
Регистрация: 04.06.2008
Сообщений: 5,623
|
|||||||||||
31.10.2010, 16:29 | 7 | ||||||||||
Ты описал пункт 1, 2 и 3. Я предлагаю обратиться к пункту 0 или даже -1
...Что происходит ДО выполнения этих трёх пунктов? Много чего. Но меня интересует f3=f1.add(f2) Ты ведь согласишься, что f1=f2+ f3 подменяется f3=f1.add(f2)? А теперь смотри, итак add(f2) В функцию add передаётся параметром объект f2. Вопрос: должен ПРИ ЭТОМ вызываться конструктор копирования? Ответ: да должен. За доказательсвтом лезем в книгу и читаем: "Ниже представлены ситуации, в которых конструктор копирования вызывается автоматически: 1) ПРопускаем эту ситуацию 2) Когда аргумент имеет тип класса. Создаётся копия аргумента и затем передаётся в функцию" Второй пункт это наша ситуация. Я хочу воочию убедиться, что конструктор копирования действительно вызван. Для этого я задаюсь вопросом: а какой именно конструктор копирования? А вот этот:
1) у него принимаемый аргумент имеет тип const FloatFraction &src (это соответствет f2 2) Этот конструктор "принадлежит" классу FloatFraction. Это как раз наша ситуация, ведь вся эта херь add(f2) "принадлежит" объекту класса FloatFraction- объекту f1. Действительно: f3=f1.add(f2) Ну то есть есть все основания, что ПРЕЖДЕ ЧЕМ выполнятся пункты, о которых ты сказал, вызовется вышеупомянутый конструктор копирования. Для того, чтобы в этом убедиться, как я уже сказал, пишем так:
Где ошибка в рассуждениях? Добавлено через 3 минуты Так не пойдёт, я ничё не перепутал. Смотри свой первый код, там и намёка нет на ProperFraction
0
|
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
|
||||||
31.10.2010, 17:24 [ТС] | 8 | |||||
0
|
быдлокодер
1720 / 907 / 106
Регистрация: 04.06.2008
Сообщений: 5,623
|
|||||||||||
31.10.2010, 17:58 | 9 | ||||||||||
Разве это имеет значение? Не знаю. Постараюсь исходить из сухих тык скыть фактов и опровергнуть сей аргумент
Во-первых, я уже приводил цитату из книги, согласно которой конструктор копирования ДОЛЖЕН вызываться в этом случае Во-вторых (этого я не говорил) далее в книге читаем: "Синтаксис для объявления конструктора следующий имя_класса (имя_класса const &источник)" То есть в качестве образца мы видим передачу именно ССЫЛКИ. Как ни крути, а аргумент, что раз ссылка, то конструктор вызываться не должен, не канает НАколнец, третье. Там есть ещё конструктор копирования. Вот он:
0
|
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
13.12.2012, 09:41 | 10 |
0
|
В астрале
![]() 8030 / 4787 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
|
|||||||||||
13.12.2012, 10:54 | 11 | ||||||||||
Итог: Вызов двух конструкторов копирования очевидным образом.
0
|
быдлокодер
1720 / 907 / 106
Регистрация: 04.06.2008
Сообщений: 5,623
|
|
13.12.2012, 11:05 | 12 |
Я разобрался давно уж вроде. Вывод: использование ссылки это по факту работа с указателем, но без синтаксиса указателя. Как в учебнике и написано.
0
|
Тематические курсы и обучение профессиям онлайн Профессия Разработчик на C++ (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
13.12.2012, 16:39 | 13 |
Ссылка это альтернативное имя объекта, по которому можно к нему обращаться, и ссылка всегда инициализирована - другого не допустит компилятор, за исключением некоторых ситуаций, вызванных как раз таки не верныой работой с сылками)
0
|
13.12.2012, 16:39 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Оператор присваивания в c++ оператор присваивания Оператор присваивания Оператор присваивания Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |