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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

*this - C++

12.02.2013, 22:40. Просмотров 459. Ответов 5
Метки нет (Все метки)

Пусть в классе определена такая функция
C++
1
2
3
String String::operator=()
return *this;
}
this это указатель на данный объект. Тогда почему внутри нельзя написать
return *this;
Это ведь как разыменовывание указателя? Таким образом мы просто возвращаем данный объект.
Но на деле функция должна быть такой (в определении добавился знак ссылки).
String &String::operator()
{
return *this;
}
Получается если взять первый случай, то если возвращать данный объект, то произойдет бесконечная рекурсия присваивания? Но опять же нет, я тестировал оно выходило из этой функции нормально, правда результат был ошибочный.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
12.02.2013, 22:42 #2
Что спросить-то хотел?
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.02.2013, 22:44 #3
Цитата Сообщение от kebal Посмотреть сообщение
this это указатель на данный объект
верно
Цитата Сообщение от kebal Посмотреть сообщение
Тогда почему внутри нельзя написать
return *this;
что?
Цитата Сообщение от kebal Посмотреть сообщение
Это ведь как разыменовывание указателя?
да

Цитата Сообщение от kebal Посмотреть сообщение
Получается если взять первый случай, то если возвращать данный объект, то произойдет бесконечная рекурсия присваивания?
нет, с чего бы это?
0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
13.02.2013, 00:42  [ТС] #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^
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
13.02.2013, 00:59 #5
Рассмотрим, что происходит:

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

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

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

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

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

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

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