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

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

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

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

03.03.2009, 00:13. Просмотров 1581. Ответов 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 присваивается нужное значение? почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
03.03.2009, 09:56     Перегрузка оператора ++ #2
Помойму здесь надо сделать дружественную функцию класса(код писать не буду, некогда)
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,341
03.03.2009, 10:06     Перегрузка оператора ++ #3
Цитата Сообщение от Викдон Посмотреть сообщение
Но в строке [....] объекту One присваивается нужное значение? почему?
Повезло. Как карта ляжет.....
Правильно так:
C++
1
2
3
4
const My& operator ++ () {
    ++itsAge;
    return *this;
}
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.03.2009, 10:08     Перегрузка оператора ++ #4
Потому что при возпращении ссылки создается копия temp, вот ссылка на нее и возвращается.
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
03.03.2009, 10:10  [ТС]     Перегрузка оператора ++ #5
Так ведь при возвращении ссылки конструктор копиования же не вызывается? Ведь для этого же нужно использовать ссылку?
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 секунд
а ето к тому, что конструктор копирования вызывается.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,341
03.03.2009, 12:44     Перегрузка оператора ++ #7
Цитата Сообщение от Викдон Посмотреть сообщение
Но в строке [....] объекту One присваивается нужное значение? почему?
В предыдущем сообщении я был не прав. По Стандарту 8.5.3, ссылка на константный временный объект будет "держать" его до выхода из объемлющего блока, в твоем случае - из функции main().
Что же касается кода, то для префиксного инкремента правильный код такой и должен быть, как я привел.
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
04.03.2009, 01:07  [ТС]     Перегрузка оператора ++ #8
Ну у меня вызывается деструктор на строке "return Temp;" и я даже делал возвращение не на const объект и все равно работает...?

Добавлено через 47 минут 13 секунд
Да и еще один вопросик) Вот у меня есть пользовательский конструктор копирования в классе, И при операции "=" над объектами класса он почему то не вызывается?
Фенрир
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;
 
    }
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
04.03.2009, 22:48  [ТС]     Перегрузка оператора ++ #10
Ну у меня вызывается деструктор на строке "return Temp;" и я даже делал возвращение не на const объект и все равно работает...?
indefini
1 / 1 / 0
Регистрация: 12.02.2009
Сообщений: 11
05.03.2009, 03:24     Перегрузка оператора ++ #11
объекту One присваивается нужное значение? почему?
Нужное - это какое? И почему бы и не присваиваться тому, что присваивается?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2009, 11:17     Перегрузка оператора ++
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
05.03.2009, 11:17  [ТС]     Перегрузка оператора ++ #12
Объекту One присваивается значение объекта Frisky увеличенное на единицу.
Yandex
Объявления
05.03.2009, 11:17     Перегрузка оператора ++
Ответ Создать тему
Опции темы

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