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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
#1

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

03.03.2009, 00:13. Просмотров 1594. Ответов 11
Метки нет (Все метки)

вот простенькая прога:
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
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
 
class My{
public:
    My(){itsAge=0;}
    ~My(){}
    My(int a):itsAge(a){}
    void Set(int a){itsAge=a;}
    
    const My& operator ++ (){
                itsAge++;
       My Temp(itsAge);
      return  Temp;
    }
private:
    int itsAge;
 
};
  
 
int main()   
{    
    My Frisky;
    Frisky.Set(5);
     My One=++Frisky;
 
     
 
 
    return 0;   
}
Вот в чем возник вопрос: operator ++ возвращает ссылку на класс My, а точнее на локальный объект Temp. Но при возвращении из operator++ Temp удаляется и получается operator++ возвращает ссылку на несуществующий объект? Но в строке
C++
1
My One=++Frisky;
объекту One присваивается нужное значение? почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2009, 00:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора ++ (C++):

Перегрузка оператора + и = - C++
Здравствуйте! Возникла проблема при реализации кода перегрузки операторов. BigInt - это просто класс характеризующий огромные числа в...

Перегрузка оператора - C++
Есть такой вот код: #include <iostream> using namespace std; template <class T> class LIST { T field; unsigned long long int...

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

Перегрузка оператора - C++
Здравствуйте. Не могу разобраться, как перезагрузить оператор >>. int a; cin >> a; Надо, чтобы a умножалось на некое число,...

Перегрузка оператора + - C++
Вот заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include <iostream> using namespace...

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

11
RazorQ
581 / 348 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
03.03.2009, 09:56 #2
Помойму здесь надо сделать дружественную функцию класса(код писать не буду, некогда)
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
03.03.2009, 10:06 #3
Цитата Сообщение от Викдон Посмотреть сообщение
Но в строке [....] объекту One присваивается нужное значение? почему?
Повезло. Как карта ляжет.....
Правильно так:
C++
1
2
3
4
const My& operator ++ () {
    ++itsAge;
    return *this;
}
0
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.03.2009, 10:08 #4
Потому что при возпращении ссылки создается копия temp, вот ссылка на нее и возвращается.
0
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
03.03.2009, 10:10  [ТС] #5
Так ведь при возвращении ссылки конструктор копиования же не вызывается? Ведь для этого же нужно использовать ссылку?
0
Absolute
0 / 0 / 0
Регистрация: 27.12.2008
Сообщений: 3
03.03.2009, 11:45 #6
C++
1
2
3
4
5
6
public:   
    My(){itsAge=0;cout<<"def constr"<<endl;}   
    ~My(){cout<<"destruct"<<endl;}   
    My(int a):itsAge(a){cout<<"constr"<<endl;}
    My(const My& initMy){itsAge = initMy.itsAge; cout<<"copy constr"<<endl;}
    void Set(int a){itsAge=a;}
попробуй так посмотреть.

Добавлено через 7 минут 19 секунд
а ето к тому, что конструктор копирования вызывается.
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
03.03.2009, 12:44 #7
Цитата Сообщение от Викдон Посмотреть сообщение
Но в строке [....] объекту One присваивается нужное значение? почему?
В предыдущем сообщении я был не прав. По Стандарту 8.5.3, ссылка на константный временный объект будет "держать" его до выхода из объемлющего блока, в твоем случае - из функции main().
Что же касается кода, то для префиксного инкремента правильный код такой и должен быть, как я привел.
0
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
04.03.2009, 01:07  [ТС] #8
Ну у меня вызывается деструктор на строке "return Temp;" и я даже делал возвращение не на const объект и все равно работает...?

Добавлено через 47 минут 13 секунд
Да и еще один вопросик) Вот у меня есть пользовательский конструктор копирования в классе, И при операции "=" над объектами класса он почему то не вызывается?
0
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
04.03.2009, 15:06 #9
нужно перегрузить оператор =
конструктор копии вызывается при инициализации 1го объекта класса другим.

Добавлено через 2 минуты 37 секунд
C++
1
2
3
4
5
6
7
8
   My& operator = (const My& other)
    {     if (this!=&other)
          {  
              //--------------
           }
         return *this;
 
    }
0
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
04.03.2009, 22:48  [ТС] #10
Ну у меня вызывается деструктор на строке "return Temp;" и я даже делал возвращение не на const объект и все равно работает...?
0
indefini
1 / 1 / 0
Регистрация: 12.02.2009
Сообщений: 11
05.03.2009, 03:24 #11
объекту One присваивается нужное значение? почему?
Нужное - это какое? И почему бы и не присваиваться тому, что присваивается?
0
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
05.03.2009, 11:17  [ТС] #12
Объекту One присваивается значение объекта Frisky увеличенное на единицу.
0
05.03.2009, 11:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2009, 11:17
Привет! Вот еще темы с ответами:

Перегрузка оператора << - C++
Есть такой код. class matrix { public: ......; const double* operator(int) const; double* const operator(int); friend...

Перегрузка оператора + - C++
Всем добрый вечер. Прошу помочь разобраться. Задание - Для определения даты поставки строительных материалов необходимо перегрузить...

Перегрузка оператора ++ - C++
#include &quot;Operation.h&quot; using namespace std; const int COUNT = 10; int _tmain(int argc, _TCHAR* argv) { srand((unsigned...

Перегрузка оператора = - C++
StringOne&amp; StringOne::operator=(char *s) { char b; strcpy(b, s); StringOne a = b; return a;//возвращает тоже самое почемуто...


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

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

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