Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2012, 16:58   #21
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
?
При каких таких this?
Пример о копировании указателя, а не данных.
Возвращаемое значение не принципиально.
ошибаетесь в с++ все везде объекты....
если вас = папа + мама.
или вас = вас + вас.
дело в том что, вы меняете содержимое объектов...
этого нельзя делать...
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 17:10   #22
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Как-то Вы формулируете не ясно. Почему это портятся объекты?
Давайте конкретно. Итак, при вызове оператора копирования
и при возврате ссылки *this портится .... Что?
EUGY вне форума Ответить с цитированием
Старый 21.12.2012, 17:26   #23
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Как-то Вы формулируете не ясно. Почему это портятся объекты?
Давайте конкретно. Итак, при вызове оператора копирования
и при возврате ссылки *this портится .... Что?
хорошо... давайте пример со строк....
есть assign() и append();
я реализую 3 оператора
приравнвание
добавление
и то и то сразу.

Прошу обратить внимание, что ссылку на this я отправляю только в 3.
Код:
const String operator=(const String& s)
{
//Впринципе мы можем и this для равно это исключение.
//А вобще этот оператор выглядить должен как коструктор копий.
//если уж совсем по правилам безопастности
assign(s);
return *this;  //тут я отправляю this, но поскольку возвращаю не ссылку
                   //то генерируется новый объект иначе будет отправлен this
}
const String operator+(const String& s)
{
    String str;              //делаю новый
    str.assign(*this);
    str.append(s);
    return str;
}
const String& operator+=(const String& s)
{
    assign(*this);   // изменяю объект
    append(s);
    return *this;
}
Не знаю как у вас.. но я написался этих операторов... и говорю совершено не с пустого места.
1 оператор дубликат конструктора копии, ну за исключением деталей.
2 оператор создаёт новый объект не портя не текущий не в аргументе
3 оператор принимает удар изменений на себя.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 17:41   #24
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ссылка в C++ это по сути указатель, просто Страус для упрощения синтаксиса ее ввел.
То есть такая запись в принципе равнозначна
Код:
	xmystr& operator = (const xmystr& r)
	{
		return *this;
	}
	xmystr* operator = (const xmystr& r)
	{
		return this;
	}
В чем проблема корректно использовать возвращаемое значение?
Тем более, что в приведенном мной до этого коде это вообще не принципиально.
Разумеется если бездумно подходить, то испортить можно всё.
EUGY вне форума Ответить с цитированием
Старый 21.12.2012, 17:48   #25
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Ссылка в C++ это по сути указатель, просто Страус для упрощения синтаксиса ее ввел.
То есть такая запись в принципе равнозначна
Код:
	xmystr& operator = (const xmystr& r)
	{
		return *this;
	}
	xmystr* operator = (const xmystr& r)
	{
		return this;
	}
В чем проблема корректно использовать возвращаемое значение?
Тем более, что в приведенном мной до этого коде это вообще не принципиально.
Разумеется если бездумно подходить, то испортить можно всё.
тема очень интересна для автора, но куда то пропал.
ну Янг писал, что i(a) вызывает конструктор напрямую i = a создаёт новый объект и следом конструктор копий. где то в одной из книг я у него вычитал.
/-----
насчёт бездумно да....
например как у автора. но он ещё больше замарался в new и delete.
на его месте я бы реализовал функции отладил их.. и использовал в операторах.
//------
а так я просто котегорически против ссылок. и уж тем более указателей в
операторах типа +-/*= ибо я могу записать в с++
Код:
a = b + c = d + i * g = u / t
когда как с +=-=*=/=
Код:
a += b += c
не напишешь.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 21.12.2012 в 17:55.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 18:07   #26
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
String operator=
Вот у Вас с объектом String возврат нового объекта оправдан. Ведь, если в возвращаемом значении использовать ссылку
Код:
String& operator=
и провести какие-то манипуляции, то они отразятся на первоначальном объекте.
Иное дело, когда нужна сквозная передача. Данные хранятся не в объекте, а где-то отдельно и нужно просто передать на них указатель.
Бессмысленно каждый раз при этой передаче порождать новый объект.
А именно это и происходит при выходе из функции String operator=.
Я это так понимаю...
EUGY вне форума Ответить с цитированием
Старый 21.12.2012, 18:13   #27
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Код:
String operator=
Вот у Вас с объектом String возврат нового объекта оправдан. Ведь, если в возвращаемом значении использовать ссылку
Код:
String& operator=
и провести какие-то манипуляции, то они отразятся на первоначальном объекте.
Иное дело, когда нужна сквозная передача. Данные хранятся не в объекте, а где-то отдельно и нужно просто передать на них указатель.
Бессмысленно каждый раз при этой передаче порождать новый объект.
А именно это и происходит при выходе из функции String operator=.
Я это так понимаю...
Мне даже приятно читать Ваш текст.
Печалько, что я так не могу.

Идею вашу понял, но дисциплинировать себя, особенно в таком языке, я думаю будет не лишнем. Ведь кто знает в чьи лапы ваш объект попадёт.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 21:11   #28
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
тема очень интересна для автора, но куда то пропал.
Я не пропал, я заново перечитывал главу про это всё.

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
например как у автора. но он ещё больше замарался в new и delete.
на его месте я бы реализовал функции отладил их.. и использовал в операторах.
Мне принципиально реализовать так, как я показал, чтоб вкурить эти действия и двигаться дальше в обучении.

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
а так я просто котегорически против ссылок. и уж тем более указателей в
операторах типа +-/*=
Очень зря.
Цитата:
Сообщение от EUGY Посмотреть сообщение
Бессмысленно каждый раз при этой передаче порождать новый объект.
Именно! Ведь это дополнительные затраты ресурсов на создание нового объекта. В книге, которую я сейчас читаю приводится много аргументов в пользу использования ссылок и указателей где только возможно и не поощряется лишние копирования и создания копий.

Друзья, я дико извиняюсь, но я мало понимаю ваши методы решения данного задания в силу того, что я сам еще мало знаю и мало умею. Я привык двигаться последовательно в обучении и не прыгать наперед. Ваши решения для меня еще пока темный лес. Я можно сказать только начал разбираться с классами и до наследования, друзей, повторного использования кода и т.д. мне еще далеко.
Спасибо за проявленное внимание к теме, для себя я всё-равно подчерпнул много полезного. Буду разбираться дальше
Suby вне форума Ответить с цитированием
Старый 21.12.2012, 21:28   #29
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Suby Посмотреть сообщение
Именно! Ведь это дополнительные затраты ресурсов на создание нового объекта.
Тут понимаешь в чем дело, если результатом выражения является новый объект, то тебе в любом случае придется строить новый объект.

Невозможно построить новый объект, не затратив времени на его постройку.

Вот например:

Код:
x = 10+5; //в результате, x будет равен 15
При этом, 10 останется 10, а 5 останется равным 5
10 же не превратится в 15.

То есть, все величины в правой части выражения не изменяться.

Можно переписать это вот так:

Код:
int a = 10;
int b = 20;
int c = a+b;
Здесь a и b - тоже никак не должны измениться.

И единственный способ сделать это - это вернуть новый объект.

Выражение а+b порождает невидимый временный объект, у которого даже нет имени.

И именно значение этого невидимого объекта присваивается объекту c.


Сначала a+b породят некий временный невидимый объект х, который будет суммой этих двух объектов.

И только потом, объект с будет инициализирован значением этого невидимого x.

Что касается производительности - современные компиляторы умеют оптимизировать такие вещи. Компилятор догадается выбросить промежуточный временный объект, и сразу же создаст объект c который будет являться суммой объектов a и b

А объект с в любом случае нужно будет построить.
Таким образом, время будет затрачено только на вычисление суммы двух старых объектов, и на строительство одного нового объекта.
_Bers вне форума Ответить с цитированием
Старый 21.12.2012, 21:42   #30
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Тут понимаешь в чем дело, если результатом выражения является новый объект, то тебе в любом случае придется строить новый объект.

Невозможно построить новый объект, не затратив времени на его постройку.
Я это всё понимаю. Я имел в виду маленько другое... Ну предположим, например, если сравнить передачу аргументов функции по ссылке и по значению. Если мы передаем аргументы по значению то создается копия аргумента, а если по ссылке то нет.
Suby вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение памяти Dady 1992 Общие вопросы C/C++ 2 26.06.2012 18:45
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Конструктор копирования и оператор присваивания DenisS0 Общие вопросы C/C++ 4 05.12.2011 10:41
До выделение памяти MAKTE Общие вопросы C/C++ 4 20.05.2008 21:34