Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 99
#1

перегрузка операторов

25.10.2012, 07:50. Просмотров 1269. Ответов 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
Ответы с готовыми решениями:

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

Перегрузка операторов
Здравствуйте! Пытаюсь понять синтаксис перегрузки операторов: Вот код: ...

Перегрузка операторов
В общем учу эту тему и ввожу код один в один как в уроке, но в уроке он...

Перегрузка операторов
написал программу. проверил. вроде все правильно. но не работает. программа...

Перегрузка операторов С++
Здравствуйте, недавно начал изучать С++, до этого старался решать проблемы...

20
vxg
Модератор
3236 / 2040 / 319
Регистрация: 13.01.2012
Сообщений: 7,898
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
Сообщений: 99
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 / 1
Регистрация: 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
Сообщений: 99
26.10.2012, 06:53  [ТС] #5
Нет нельзя.
0
nikeo
0 / 0 / 1
Регистрация: 25.10.2012
Сообщений: 20
26.10.2012, 06:53 #6
и как плюс,сслыка на объект *this,дает возможность его изменять.и иногда это необходимо!
Но все же,читабельность кода падает,по этому,такие конструкции лучше не использовать,а найти более логичную альтернативу.
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 99
26.10.2012, 06:59  [ТС] #7
В каких случаях вообще надо применять код из первого примера, а в каких из второго?
Можно пример?
0
nikeo
0 / 0 / 1
Регистрация: 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
Сообщений: 99
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
++Ͻ
14367 / 8149 / 1534
Регистрация: 27.09.2012
Сообщений: 20,085
Записей в блоге: 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
Сообщений: 99
26.10.2012, 07:44  [ТС] #11
Еще такой вопрос:
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю?
0
vxg
Модератор
3236 / 2040 / 319
Регистрация: 13.01.2012
Сообщений: 7,898
26.10.2012, 11:00 #12
Цитата Сообщение от Nesh Посмотреть сообщение
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю
внешнюю - обычно когда левый операнд не является объектом нашего класса. иных случаев думаю нет
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
26.10.2012, 13:52 #13
vxg, Не совсем верно. Лучше всегда, когда это возможно, предпочитать перегрузку оператора свободной функцией, чем перегрузку оператора функцией класса.
0
vxg
Модератор
3236 / 2040 / 319
Регистрация: 13.01.2012
Сообщений: 7,898
26.10.2012, 14:35 #14
только как это сделать если по хорошему операция реализует метод, а метод должен иметь доступ к закрытым компонентам класса. заводить кучу друзей класса? и почему именно лучше?
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
26.10.2012, 20:55 #15
Потому что оператор — это не совсем метод класса. Это метод двух классов. По крайней мере, это касается всякой арифметики. Присваивания или, например, индексации логичнее всё же размещать внутри, потому что они действительно зависят от внутреннего строения класса.
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.10.2012, 01:41 #16
~OhMyGodSoLong~, Да их вообщем-то и не разместишь снаружи-то.
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 99
10.11.2012, 15:22  [ТС] #17
Еще интересуют вот эти два момента
C++
1
String String::operator+=
и
C++
1
String & String::operator+=
Для чего возвращать ссылку и когда это нужно?
0
Croessmah
++Ͻ
14367 / 8149 / 1534
Регистрация: 27.09.2012
Сообщений: 20,085
Записей в блоге: 3
Завершенные тесты: 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;
}
0
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 99
10.11.2012, 16:26  [ТС] #19
Еще такой вопрос:
C++
1
void foo(const type &)
Зачем передавать параметр методу по ссылки если менять его все равно не собираемся?
0
Croessmah
++Ͻ
14367 / 8149 / 1534
Регистрация: 27.09.2012
Сообщений: 20,085
Записей в блоге: 3
Завершенные тесты: 1
10.11.2012, 16:31 #20
Цитата Сообщение от Nesh Посмотреть сообщение
Зачем передавать параметр методу по ссылки если менять его все равно не собираемся?
По сути ссылка - это такой указатель своеобразный.
Так что если у нас передается структура, размером в 100 байт, то "дешевле" передать по ссылке. Плюс ко всем, если Вы передаете не по ссылке, то создается копия объекта, а это значит, что будет лишний вызов конструктора копирования.
1
10.11.2012, 16:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2012, 16:31

Перегрузка операторов
Столкнулся с проблемой при написании лабораторной по перегрузке операторов....

Перегрузка операторов
Почему-то выводятся нули в qDebug(): #include &lt;QCoreApplication&gt; #include...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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