Форум программистов, компьютерный форум CyberForum.ru

*this - C++

Восстановить пароль Регистрация
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 22:40     *this #1
Пусть в классе определена такая функция
C++
1
2
3
String String::operator=()
return *this;
}
this это указатель на данный объект. Тогда почему внутри нельзя написать
return *this;
Это ведь как разыменовывание указателя? Таким образом мы просто возвращаем данный объект.
Но на деле функция должна быть такой (в определении добавился знак ссылки).
String &String::operator()
{
return *this;
}
Получается если взять первый случай, то если возвращать данный объект, то произойдет бесконечная рекурсия присваивания? Но опять же нет, я тестировал оно выходило из этой функции нормально, правда результат был ошибочный.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
12.02.2013, 22:42     *this #2
Что спросить-то хотел?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.02.2013, 22:44     *this #3
Цитата Сообщение от kebal Посмотреть сообщение
this это указатель на данный объект
верно
Цитата Сообщение от kebal Посмотреть сообщение
Тогда почему внутри нельзя написать
return *this;
что?
Цитата Сообщение от kebal Посмотреть сообщение
Это ведь как разыменовывание указателя?
да

Цитата Сообщение от kebal Посмотреть сообщение
Получается если взять первый случай, то если возвращать данный объект, то произойдет бесконечная рекурсия присваивания?
нет, с чего бы это?
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
13.02.2013, 00:42  [ТС]     *this #4
Спросить я хотел то, что если писать
return *this;
то обязательно возвращаемое значение функции должно быть типа Object &.
А почему нельзя просто Object?
Если сделать просто Object, то копирование нормально не произойдет, я проверил. Или дать более точный код?

Добавлено через 2 минуты
Вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const Polinomials &Polinomials::operator=(const Polinomials &right) 
{
    if (this != &right)
    {
        number = right.number;
        delete [] pPtr;
        pPtr = new int[number];
        assert(pPtr != 0);
        for (int i = 0; i < number; i++)
            pPtr[i] = right.pPtr[i];
    }
    return *this;
}
Если убрать & в определении функции. Затем выполнить присвоение например
first = second;
И если в объекте second значения массива были {0, 1, 2, }, то в первом они будут что-то типа {-12312312,123123,-123123}

Добавлено через 1 час 1 минуту
up^
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.02.2013, 00:59     *this #5
Рассмотрим, что происходит:

Во-первых нужно чётко понимать, что сейчас у тебя возвращается УКАЗАТЕЛЬ, да-да. Несмотря на то, что написано
C++
1
return* this
Посмотри в любой учебник, там везде сказано. что ссылки это работа с указателями, но без синтаксиса указателей. То есть у тебя вернётся именно укахзатель, который тут же- внимание- РАЗЫМЕНУЕТСЯ. И создастся впечатление, что вернулся объект. Просто.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

А теперь если написать вот так (без ссылки):

C++
1
const Polinomials Polinomials::operator=(const Polinomials &right)
Что произойдёт? Вернётся САМ объект- но если бы этим дело ограничилось! Компилятор в этом случае будет искать конструктор копирования и если его нет, то вставит свой, который (у меня так написано) "Поведение конструктора копирования, добавляемого компилятором, заключается в создании побитовой копии каждого из членов-данных";

То есть когда ты пытаешься так вот сделать (не использовать ссылку, а возвращать объект), он побитово копирует и по-видимому не то, что тебе надо.

Давай пока на этом остановимся, скажи, у тебя ведь нет конструктора копирования?
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
13.02.2013, 01:13  [ТС]     *this #6
Ой, спасибо вам громадное. Я допустил ошибку, я думал, что если есть =, то это и есть копирование объекта. Получается для присваивания нужен метод, а если брать копирование, то нужно иметь конструктор. Именно поэтому я ещё над одной задачей бьюсь уже часа 2, а вы так хорошо помогли!!
Yandex
Объявления
13.02.2013, 01:13     *this
Ответ Создать тему
Опции темы

Текущее время: 21:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru