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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
25.10.2012, 07:50     перегрузка операторов #1
Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса.
Первый:
Чем отличается вот этот код
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;
}
Различия только в ссылках, Но работает вроде одинаково что в первом что во втором случаях.
И второй:
Зачем возвращать указатель на текущий объект?
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 07:50     перегрузка операторов
Посмотрите здесь:

C++ [c++] Перегрузка операторов
[C++] Перегрузка операторов C++
C++ Перегрузка операторов
перегрузка операторов C++
C++ перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2663 / 1674 / 157
Регистрация: 13.01.2012
Сообщений: 6,251
25.10.2012, 09:38     перегрузка операторов #2
различие в том что в первом случае нельзя сделать
C++
1
(x += 2) = 8;
а так вроде не принято (во всяком случае так построены реализации строковых классов). все операторы X= (+=, -=, *=, /= и т.п.) работают так же как и = и должны возвращать ссылку на объект. хотя на мой взгляд для X= это глупо - зачем нам тут же менять объект если мы только что его изменили? возвращали бы ссылку на константный объект.
возвращается не указатель. возвращается ссылка на объект инициализируемая через *this. делается это для того что бы работали конструкции вида
C++
1
a = b = c;
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;
}
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;
}
почему нельзя?на сколько я помню можно.
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 06:53  [ТС]     перегрузка операторов #5
Нет нельзя.
nikeo
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 20
26.10.2012, 06:53     перегрузка операторов #6
и как плюс,сслыка на объект *this,дает возможность его изменять.и иногда это необходимо!
Но все же,читабельность кода падает,по этому,такие конструкции лучше не использовать,а найти более логичную альтернативу.
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 06:59  [ТС]     перегрузка операторов #7
В каких случаях вообще надо применять код из первого примера, а в каких из второго?
Можно пример?
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;
}
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?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
26.10.2012, 07:36     перегрузка операторов #10
Цитата Сообщение от Nesh Посмотреть сообщение
Я имел ввиду перегрузку с двумя параметрами.
Интересно, для какой операции?
a+b c?

Добавлено через 4 минуты
C++
1
operator+(const String &lh, const String &rh)
вместо lh будет this
а если Вам нужен такой оператор в классе, сделайте его static
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 07:44  [ТС]     перегрузка операторов #11
Еще такой вопрос:
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю?
vxg
Модератор
 Аватар для vxg
2663 / 1674 / 157
Регистрация: 13.01.2012
Сообщений: 6,251
26.10.2012, 11:00     перегрузка операторов #12
Цитата Сообщение от Nesh Посмотреть сообщение
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю
внешнюю - обычно когда левый операнд не является объектом нашего класса. иных случаев думаю нет
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2012, 13:52     перегрузка операторов #13
vxg, Не совсем верно. Лучше всегда, когда это возможно, предпочитать перегрузку оператора свободной функцией, чем перегрузку оператора функцией класса.
vxg
Модератор
 Аватар для vxg
2663 / 1674 / 157
Регистрация: 13.01.2012
Сообщений: 6,251
26.10.2012, 14:35     перегрузка операторов #14
только как это сделать если по хорошему операция реализует метод, а метод должен иметь доступ к закрытым компонентам класса. заводить кучу друзей класса? и почему именно лучше?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.10.2012, 20:55     перегрузка операторов #15
Потому что оператор — это не совсем метод класса. Это метод двух классов. По крайней мере, это касается всякой арифметики. Присваивания или, например, индексации логичнее всё же размещать внутри, потому что они действительно зависят от внутреннего строения класса.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.10.2012, 01:41     перегрузка операторов #16
~OhMyGodSoLong~, Да их вообщем-то и не разместишь снаружи-то.
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
10.11.2012, 15:22  [ТС]     перегрузка операторов #17
Еще интересуют вот эти два момента
C++
1
String String::operator+=
и
C++
1
String & String::operator+=
Для чего возвращать ссылку и когда это нужно?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
10.11.2012, 15:48     перегрузка операторов #18
Цитата Сообщение от Nesh Посмотреть сообщение
Для чего возвращать ссылку и когда это нужно?
Чтобы возвращать сам объект, а не его копию.
Просто как пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
using std::string;
using std::cout;
class str{
private:
    string s;
public:
    string & operator=(const char *rhv){
        s.append(rhv); return s;
    }
    string & getstr(){return s;}
    str  operator+=(const char *rhv){//протестируйте так, а потом так str  & operator+=(const char *rhv)
        s.append(rhv);
        return *this;
    }
};
 
 
void AddString(str &s){
    s+="C";
}
 
int main(){
        
    str s;
    s="A";
    AddString(s+="B");
    s+="D";
    cout<<s.getstr()<<"\n";
    system("pause");
    return 0;
}
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
10.11.2012, 16:26  [ТС]     перегрузка операторов #19
Еще такой вопрос:
C++
1
void foo(const type &)
Зачем передавать параметр методу по ссылки если менять его все равно не собираемся?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2012, 16:31     перегрузка операторов
Еще ссылки по теме:

Перегрузка операторов C++
Перегрузка операторов C++
C++ Перегрузка операторов (--, +=, -=, == )

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
10.11.2012, 16:31     перегрузка операторов #20
Цитата Сообщение от Nesh Посмотреть сообщение
Зачем передавать параметр методу по ссылки если менять его все равно не собираемся?
По сути ссылка - это такой указатель своеобразный.
Так что если у нас передается структура, размером в 100 байт, то "дешевле" передать по ссылке. Плюс ко всем, если Вы передаете не по ссылке, то создается копия объекта, а это значит, что будет лишний вызов конструктора копирования.
Yandex
Объявления
10.11.2012, 16:31     перегрузка операторов
Ответ Создать тему
Опции темы

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