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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
#1

перегрузка операторов - C++

25.10.2012, 07:50. Просмотров 1181. Ответов 20
Метки нет (Все метки)

Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса.
Первый:
Чем отличается вот этот код
C++
1
2
3
4
5
6
7
8
9
10
String  String::operator+=(const String other)
{
    char *c_str = new char[str_size + other.str_size + 1];
    strcpy(c_str, str);
    strcat(c_str, other.str);
    delete[] str;
    str = c_str;
    str_size = str_size + other.str_size; 
    return *this;
}
От этого
C++
1
2
3
4
5
6
7
8
9
10
String & String::operator+=(const String &other)
{
    char *c_str = new char[str_size + other.str_size + 1];бо
    strcpy(c_str, str);
    strcat(c_str, other.str);
    delete[] str;
    str = c_str;
    str_size = str_size + other.str_size; 
    return *this;
}
Различия только в ссылках, Но работает вроде одинаково что в первом что во втором случаях.
И второй:
Зачем возвращать указатель на текущий объект?
Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 07:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос перегрузка операторов (C++):

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка операторов - C++
Доброго времени суток! Столкнулся с такой проблемой, перегрузка операторов. Имею работающий код, но не смог сделать по своему заданию. ...

Перегрузка операторов - C++
В общем задание следующее: Создайте класс chess (шахматы), в котором хранятся поля шахматной доски x, y (целые числа, лежащие в диапазоне...

Перегрузка операторов - C++
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора «^». Оператор «^» должен возводить...

[c++] Перегрузка операторов - C++
Не работает. #include <conio.h> #include <iostream.h> #pragma argsused struct FazzyNumber { double x; double x1,x2; ...

C++ перегрузка операторов - C++
люди такая ситуация кто может в краце объясните перегрузку операторов мне например надо перегрузить оператор умножения что бы умножить...

20
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
25.10.2012, 09:38 #2
различие в том что в первом случае нельзя сделать
C++
1
(x += 2) = 8;
а так вроде не принято (во всяком случае так построены реализации строковых классов). все операторы X= (+=, -=, *=, /= и т.п.) работают так же как и = и должны возвращать ссылку на объект. хотя на мой взгляд для X= это глупо - зачем нам тут же менять объект если мы только что его изменили? возвращали бы ссылку на константный объект.
возвращается не указатель. возвращается ссылка на объект инициализируемая через *this. делается это для того что бы работали конструкции вида
C++
1
a = b = c;
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 06:41  [ТС] #3
И почему вот эту перегрузку нельзя прописать внутри класса?
C++
1
2
3
4
5
String operator+(const String &lh, const String &rh)
{
    String c_str = lh;
    return c_str += rh;
}
0
nikeo
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 20
26.10.2012, 06:48 #4
Цитата Сообщение от Nesh Посмотреть сообщение
И почему вот эту перегрузку нельзя прописать внутри класса?
C++
1
2
3
4
5
String operator+(const String &lh, const String &rh)
{
    String c_str = lh;
    return c_str += rh;
}
почему нельзя?на сколько я помню можно.
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 06:53  [ТС] #5
Нет нельзя.
0
nikeo
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 20
26.10.2012, 06:53 #6
и как плюс,сслыка на объект *this,дает возможность его изменять.и иногда это необходимо!
Но все же,читабельность кода падает,по этому,такие конструкции лучше не использовать,а найти более логичную альтернативу.
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 06:59  [ТС] #7
В каких случаях вообще надо применять код из первого примера, а в каких из второго?
Можно пример?
0
nikeo
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 20
26.10.2012, 07:18 #8
Цитата Сообщение от Nesh Посмотреть сообщение
Нет нельзя.
тогда посмотрите,какой оператор вы перегружаете!

Добавлено через 3 минуты
Цитата Сообщение от Nesh Посмотреть сообщение
В каких случаях вообще надо применять код из первого примера, а в каких из второго?
Можно пример?
ну допустим,вы создали собственный класс,скажем vector
C++
1
2
3
4
5
6
7
8
class Vector
{
int x,y,z;
 
public:
       
     Vector();
....

в этом случаи,оператор += ,нет необходимость перегружать используя ссылку.

Добавлено через 5 минут
второй случай,очень уж специфичный!
и использовать его можно,когда к примеру вам нужно не просто сложить два объекта,но и одновременно их увеличить или уменьшить(к примеру).
но для этого лучше разработать другие методы.
считайте это одной из "ненужных возможностей".
как например const int* const int p;

Добавлено через 5 минут
Цитата Сообщение от Nesh Посмотреть сообщение
И почему вот эту перегрузку нельзя прописать внутри класса?
C++
1
2
3
4
5
String operator+(const String &lh, const String &rh)
{
    String c_str = lh;
    return c_str += rh;
}
C++
1
2
3
4
5
6
7
8
9
такой перегрузится?)
Vector operator+(const Vector &other)
{
       Vector temp.x = x + other.x;
       //для "y"
       //для "z"
       
       return temp;
}
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 07:29  [ТС] #9
Цитата Сообщение от nikeo Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
такой перегрузится?)
Vector operator+(const Vector &other)
{
       Vector temp.x = x + other.x;
       //для "y"
       //для "z"
       
       return temp;
}
Я имел ввиду перегрузку с двумя параметрами.
А как же будут заданы y и z?
0
Croessmah
Эксперт CЭксперт С++
13412 / 7563 / 855
Регистрация: 27.09.2012
Сообщений: 18,614
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 07:36 #10
Цитата Сообщение от Nesh Посмотреть сообщение
Я имел ввиду перегрузку с двумя параметрами.
Интересно, для какой операции?
a+b c?

Добавлено через 4 минуты
C++
1
operator+(const String &lh, const String &rh)
вместо lh будет this
а если Вам нужен такой оператор в классе, сделайте его static
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 07:44  [ТС] #11
Еще такой вопрос:
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю?
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
26.10.2012, 11:00 #12
Цитата Сообщение от Nesh Посмотреть сообщение
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю
внешнюю - обычно когда левый операнд не является объектом нашего класса. иных случаев думаю нет
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.10.2012, 13:52 #13
vxg, Не совсем верно. Лучше всегда, когда это возможно, предпочитать перегрузку оператора свободной функцией, чем перегрузку оператора функцией класса.
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
26.10.2012, 14:35 #14
только как это сделать если по хорошему операция реализует метод, а метод должен иметь доступ к закрытым компонентам класса. заводить кучу друзей класса? и почему именно лучше?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.10.2012, 20:55 #15
Потому что оператор — это не совсем метод класса. Это метод двух классов. По крайней мере, это касается всякой арифметики. Присваивания или, например, индексации логичнее всё же размещать внутри, потому что они действительно зависят от внутреннего строения класса.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 20:55
Привет! Вот еще темы с ответами:

Перегрузка операторов - C++
В общем учу эту тему и ввожу код один в один как в уроке, но в уроке он компилится, а у меня нет. Ругается на "c1++;", подскажите...

Перегрузка операторов - C++
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора суммирования дробей, оператора суммирования дроби...

Перегрузка операторов ++ - C++
доброго времени суток. есть утечка памяти как я понимаю, но не мойму почему. о чем программа: есть обьект типа MString. В этом классе...

Перегрузка операторов - C++
Даны два одномерных массива. Необходимо сделать перегрузку разности ( - ) этих массивов с получением этого массива.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
26.10.2012, 20:55
Ответ Создать тему
Опции темы

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