3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
|
||||||
1 | ||||||
Перегруженный оператор присваивания24.06.2015, 22:52. Показов 987. Ответов 17
Метки нет (Все метки)
Достаточно информации прочитал, что такое перегруж. оператор присваивания, но не до конца понимаю суть данного вопроса - "в каком месте кода описывается то, что other является вторым аргументом оператора присваивания, собственно он является тем списком, который мы копируем в текущий список (это как вроде this)".
Этот код для однонаправленного кольцевого списка. Суть кода такова, что есть текущий список (this) и список, который мы копируем в текущий (other). В случае, когда у текущего списка будет больше элементов чем, в копируемом, то лишние элементы удаляются.
0
|
24.06.2015, 22:52 | |
Ответы с готовыми решениями:
17
Перегруженный оператор присваивания Не работает перегруженный оператор присваивания Не выполняется перегруженный оператор присваивания Очередь, конструктор копирования и перегруженный оператор присваивания |
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
24.06.2015, 23:29 | 2 |
И в чем ваш вопрос?
this это указатель на объект для которого вызывается метод и неявно передается в любой метод, по этой причине other - второй аргумент.
1
|
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
|
|
24.06.2015, 23:43 [ТС] | 3 |
OstapBender, вопрос в том, как мне обьяснить человеку по коду или словесно, что other обязательно будет тем самым вторым аргументом (то есть копируемым списком).
0
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
24.06.2015, 23:59 | 4 |
ну, для начала, вторым аргументом может быть что угодно, не обязательно экземпляр того же класса.
продемонстрировать же визуально "тот самый" первый аргумент this не предоставляется возможным, но можно показать, что перегрузка через внешнюю либо дружественную функцию невозможна - это одно из требований к оператору присваивания. а для любого метода this неявно передается как первый аргумент, это описывается в стандарте.
1
|
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
|
|
25.06.2015, 00:03 [ТС] | 5 |
OstapBender, а по коду моему это следует из первой строчки или как?
0
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
25.06.2015, 00:10 | 6 |
0
|
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
|
|
25.06.2015, 00:12 [ТС] | 7 |
OstapBender, с меня просто требовали указать это в коде, поэтому я уже сам запутался , что к чему.
По данному коду вы можете точно указать строку, где указывается это?
0
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
25.06.2015, 00:21 | 8 |
Это нигде не "указывается", это факт и данность.
Но если вам так угодно, то в коде видно, что вы используете this->... который нигде не объявляется а "неявно передается в любой метод", он то и есть тот самый первый аргумент.
0
|
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
25.06.2015, 00:45 | 9 | |||||
ни в каком.
other не является вторым аргументом оператора присвоения. он является единственным аргументом присвоения. пример: http://rextester.com/KDV21108
которое отличает его от прочих операторов или функций: его нельзя перегрузить глобально.
1
|
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
|
|
25.06.2015, 00:53 [ТС] | 10 |
hoggy, хорошо other это единственный аргумент оператора присваивания. Исходя из первой строчки, т.к. он идет после записи operator=
0
|
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
25.06.2015, 01:02 | 11 |
да
но сам оператор - бинарный. тобишь, в операции присвоения всегда участвует два операнда (не путать операнд и аргумент). в качестве левостоящего операнда выступает объект, чем оператор= был запущен. в качестве правостоящего операнда выступает ваш other.
1
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
25.06.2015, 01:06 | 12 |
Ошибаетесь. Это второй аргумент. Поскольку оператор - метод класса, то имеется неявный аргумент this. Он автоматически генерируется компилятором.
0
|
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
25.06.2015, 01:21 | 13 |
Вы ошибаетесь.
1. Стандарт ничего не говорит по поводу передачи скрытого this. И оставляет это не откуп компиляторов. 2. Соглашения о вызовах не являются частью стандарта. Более того, невзирая на соглашение о вызове, компилятор вправе оптимизировать передачу скрытого аргумента this. Именно по-этой причине, компиляторы не дают просто так кастить указатель на функцию-член, к свободной функции. Потому что программист в общем случае не может закладываться на то, как именно будет передана информация об адресе объекта для которого запускается функция-член. И попытки обойти защиту компилятора - это хак на свой страх и риск. 3. Соглашения о вызовах случаются разными. И технически нет никаких препятствий для того, что бы передавать this, например, всегда последним аргументов, либо как то ещё. Поэтому, несмотря на то, что обычно он - первый, нельзя сказать, что он всегда и априори будет первым аргументом. 4. Так или иначе, но это - кухня компилятора, а не часть языка. Формально, с точки зрения правил языка, никакого скрытого аргумента не существует. Существует ровно то, что написал программист.
0
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
25.06.2015, 01:55 | 14 |
Фактически как бы он не передавался он существует.
Хотя бы потому что в скопе метода существует this. Добавлено через 3 минуты CircleList<DataType>& CircleList<DataType>::operator=(CircleList<DataType>& other) Ото что выделено жирным фактически и есть объявлением параметра this.
0
|
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
25.06.2015, 01:58 | 15 |
не факт.
оптимизации. он может пройти через регистры, например. или какой нибудь шибко умный компилятор догадается, что в программе один единственный экземпляр (какой нибудь сингелтон), и вообще весь метод сделает inline, включая адрес объекта. Добавлено через 2 минуты жирным выделено имя класса, которому принадлежит функция-член. для того, что бы объявить указатель this нужно написать ключевое слово this. никакого другого объявления для указателя this не существует.
0
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
25.06.2015, 02:02 | 16 |
Правильно. А соответственно и есть указание компилятору добавить в функцию скрытый параметр CircleList<DataType> *this и передавать его автоматически, каким бы там методом передачи он не пользовался.
0
|
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
25.06.2015, 02:03 | 17 |
0
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
25.06.2015, 02:06 | 18 |
Когда на досуге займетесь написанием компилятора то поймете что именно так оно и есть
0
|
25.06.2015, 02:06 | |
25.06.2015, 02:06 | |
Помогаю со студенческими работами здесь
18
Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания? Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * Перегруженный оператор + Перегруженный оператор + Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |