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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
#1

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

11.11.2010, 00:40. Просмотров 1299. Ответов 25
Метки нет (Все метки)

Осуществляю перегрузку оператора +. и вот почему-то член класса s меняет свою длину с 4 до 7
и мне вот это не понятно.. Подскажите, пожалуйста!
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <string.h>
 
using std::cout;
using std::cin;
using std::endl;
 
class Arifm
{
public: 
    char s[4];
    Arifm(){};
    Arifm(char *xy)
    {
        strcpy(s,xy);
    }
    void show()
    {
        cout<<s<<endl;
    }
    Arifm operator+ (Arifm y);
};
 
Arifm Arifm::operator+ (Arifm y)
{
    Arifm x;
    
    x.s[0] = s[0] + y.s[0]-48;
    
    x.s[1] = s[1] + y.s[1]-48;
    
    x.s[2] = s[2] + y.s[2]-48;
    
    return x;
}
 
int main()
{
    char x1[4] = "111", y1[4] = "111";
    
    Arifm x(x1),y(y1);
    
    x = x + y;
    
    x.show();
        
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2010, 00:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора + (C++):

Перегрузка оператора += - C++
У меня имеется структура и метод, который вызывается след образом: A.plus_and_minus(B); Есть огромное желание перегрузить функцию += ,...

Перегрузка оператора = - C++
Есть некий класс. И два класса-наследника. Надо перегрузить оператор =, к тому же в дочерних классах вызывать перегрузку в базовом классе....

Перегрузка оператора = - C++
помогите создать перегруженный оператор = в классе Х, который будет копировать содержание строки S1 в S2.

Перегрузка оператора = - C++
Как перегрузить оператор = для char ?

Перегрузка оператора - C++
Подскажите пожалуйста, способ перегрузки операторов &gt;= и &lt;= в следующей строке if ( ob.str &gt;= '0' &amp;&amp; ob.str &lt;= '9' )Мой вариант не...

Перегрузка оператора != - C++
Помогите разобраться с перегрузкой оператора != есть класс, в котором, в разделе private объявлен указатель на массив std::string *str; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.11.2010, 01:03 #2
Цитата Сообщение от velodro Посмотреть сообщение
и вот почему-то член класса s меняет свою длину с 4 до 7
С чего вы это взяли?
0
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
11.11.2010, 01:10  [ТС] #3
если вставить strlen(x.s) он выдаст 7
а x.show выдаёт вообще 22111, а мне казалось должно выдать 222
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.11.2010, 01:18 #4
У вас какой компилятор? У меня правельный результат. Но в любом случае, не помешало бы перегрузить оператор '='.
1
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.11.2010, 01:21 #5
velodro, дело в том, что при вызове конструктора "Arifm () {}" в переменной "s" лежит мусор, и последний элемент массива не равен нулю, а в языке Си строками считаются массивы чаров, оканчивающиеся нулями. Поэтому strlen уходит за пределы массива и выдаёт неправильную длину.

Рекомендую в языке Си++ использовать не массивы чаров, а класс std::string.
1
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
11.11.2010, 01:22 #6
x = x + y;
вам нужно перегрузить равно
0
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
11.11.2010, 01:26  [ТС] #7
у меня unix компилятор (на ubuntu компилирую)
а без перегрузки = не пойдёт?
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
11.11.2010, 01:32 #8
velodro, думаю не так уж сложно перегрузить оператор =
C++
1
2
3
4
Arifm operator= (Arifm y)
{
     return *this;
}
1
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.11.2010, 01:36 #9
Во-первых, оператор присвоения в данном случае перегружать не надо, а во-вторых, правильно это делать так:
C++
1
2
3
4
5
Arifm operator = (const Arifm & y) {
        ...
 
        return *this;
}
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
11.11.2010, 07:49 #10
volovzi, А еще правильнее не забывать проверку на равенство самому себе.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
11.11.2010, 10:44 #11
Опрератор "=" здесь перегружать не нужно, просто не имеет смысла.

Цитата Сообщение от ForEveR Посмотреть сообщение
А еще правильнее не забывать проверку на равенство самому себе.
В книгах, которые я читал, про это как-то в двух словах сказано. ForEveR, можешь в двух словах описать суть этой проверки?
0
OdNairy
7 / 7 / 1
Регистрация: 07.02.2010
Сообщений: 22
11.11.2010, 11:06 #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
можешь в двух словах описать суть этой проверки
Спрашивали не меня, но я отвечу =)

Представьте, что вы делаете свой класс строки. Создаёте несколько объектов своего класса.
Как должно сейчас равно происходить представляете? Удаление того, что было. Присвоение нового.
А теперь представьте, что делает присваивание самому себе.И что получиться? Вы сразу удаляете данные, а потом. ... Пшик. Присвоить уже нечего - данные удалены. Поэтому выполняется проверка скрытого указателя this на то, что принимается, и в случае равенства - просто выход.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
11.11.2010, 11:22 #13
Так "=" это же бинарный оператор, как может быть передан this? Разве, что только так:
C++
1
object=object;
Но тут программист сам видит, что происходит, да и смысла в этой строке нет. Что-то я не совсем понял ваше объяснение(

Добавлено через 48 секунд
Можно пример кода, где такая проверка необходима?
0
OdNairy
7 / 7 / 1
Регистрация: 07.02.2010
Сообщений: 22
11.11.2010, 11:36 #14
this передаётся всегда в метод класса. Потому он и называется неявный указатель.
За точность кода сейчас не ручаюсь, потому что придумываю и сразу пишу сюда =)
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
class Row {
public:
    Row();  // default constuctor
    Row(const char* s);     // copy string to class
    Row(const Row& orig);   //copy constructor
    virtual ~Row();
 
     Row& operator= (const Row&);
 
protected:
    char* arr;
    int ln;
};
 
#endif
 
//it's e.g. so without ctors
 
Row&  Row::operator =(const Row& orig){
    if(*this == orig) return *this;
 
    delete[] this->arr;
    
    ln = orig.ln;
    this->arr = new char [t.ln + 1];
 
    charset(arr,0,t.ln + 1);    //Mine func like memset(), but just for char
    strcpy(this->arr, orig.arr);
    return *this;
}
Пример взял всё тот же - со строкой ( просто недавно помогал делать, вот и остался исходник).
1
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
11.11.2010, 11:52 #15
this передаётся всегда в метод класса. Потому он и называется неявный указатель.
Да это то я знаю, я имел ввиду как this может быть левым операндом?
Ведь
C++
1
object=object;
это глупо.

По коду: теперь понятно, да тут действительно нужна проверка на равенство самому себе.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2010, 11:52
Привет! Вот еще темы с ответами:

перегрузка оператора () - C++
Вопрос заключается в следующем: - Что собой представляет перегружаемый оператор()? - Как его перегрузить? ( обычные операторы тип ++ и...

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора += - C++
Создал класс дробь. Пытаюсь перегрузить оператор += (или -=, *=, /=) А компилятор выдаёт ошибку 'drob operator+=(drob&amp;)' must take...

Перегрузка оператора [] - C++
Сделал простой аналог auto_ptr для дин. массива. Файл #ifndef ARRAY_PTR_GUARD #define ARRAY_PTR_GUARD template&lt; class Ty_ &gt; ...


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

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

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