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

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

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

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

25.10.2012, 07:50. Просмотров 1131. Ответов 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;
}
Различия только в ссылках, Но работает вроде одинаково что в первом что во втором случаях.
И второй:
Зачем возвращать указатель на текущий объект?
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 07:50     перегрузка операторов
Посмотрите здесь:

Перегрузка операторов - C++
Здравствуйте! Сейчас читаю книгу: "Искусство программирование на С++" Шилдта. Часто встречается перегрузка. Заметил, что в некоторых...

перегрузка операторов - C++
Имеется такая программа: class reversion { vector<int> mass1; vector<int> mass2; vector<int> rev1; vector<int> rev2; ...

Перегрузка операторов - C++
Привет, ребят! Помогите разобраться с перегрузкой, а то преподы нынче и сами ничего не знают. Вот. Имеем три файла (ну если кто захочет...

Перегрузка операторов - C++
Реализуйте класс CTime , моделирующий время суток ( количество часов , минут и секунд). Каркас класса : / / Моделирует время суток ,...

Перегрузка операторов 2 - C++
Пишу класс комплексных чисел. И возникла проблема.Я перегрузил операторы +-*/. Но когда использую их в строке типа a=b+c*d - где все...

Перегрузка операторов - C++
В программе нужно сделать перегрузку оператора умножения, не могу понять что и как делать... Помогите разобраться :) #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3119 / 1921 / 208
Регистрация: 13.01.2012
Сообщений: 7,357
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
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 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
Nesh
3 / 3 / 0
Регистрация: 25.06.2009
Сообщений: 95
26.10.2012, 07:44  [ТС]     перегрузка операторов #11
Еще такой вопрос:
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю?
vxg
Модератор
3119 / 1921 / 208
Регистрация: 13.01.2012
Сообщений: 7,357
26.10.2012, 11:00     перегрузка операторов #12
Цитата Сообщение от Nesh Посмотреть сообщение
В каких случаях надо делать перегрузку как член класса, а в каких как внешнюю
внешнюю - обычно когда левый операнд не является объектом нашего класса. иных случаев думаю нет
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
26.10.2012, 13:52     перегрузка операторов #13
vxg, Не совсем верно. Лучше всегда, когда это возможно, предпочитать перегрузку оператора свободной функцией, чем перегрузку оператора функцией класса.
vxg
Модератор
3119 / 1921 / 208
Регистрация: 13.01.2012
Сообщений: 7,357
26.10.2012, 14:35     перегрузка операторов #14
только как это сделать если по хорошему операция реализует метод, а метод должен иметь доступ к закрытым компонентам класса. заводить кучу друзей класса? и почему именно лучше?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.10.2012, 20:55     перегрузка операторов #15
Потому что оператор — это не совсем метод класса. Это метод двух классов. По крайней мере, это касается всякой арифметики. Присваивания или, например, индексации логичнее всё же размещать внутри, потому что они действительно зависят от внутреннего строения класса.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 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;
}
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++
Помогите пожалуйста написать программу на тему перегрузка операторов. Задания Унарная операция. Создать объект - связный...

перегрузка операторов - C++
попробую объяснить на примере допустим есть класс class myclass { private: string stroka; public: myclass(string...

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


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

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

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