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

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

Войти
Регистрация
Восстановить пароль
 
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
#1

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

31.01.2013, 03:31. Просмотров 432. Ответов 8
Метки нет (Все метки)

Здравствуйте в столь позднее время..
Какова особеность перегрузки операторов -> и . ?

Что возвращают ?
Если можно ссылки на стандарт...Заранее спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2013, 03:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов -> <- (C++):

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

Перегрузка операторов - C++
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора суммирования дробей, оператора суммирования дроби...

[c++] Перегрузка операторов - C++
Для заданных A = (A – a1, A, A + a2) и B = (B – b1, B, B + b2) Найти сумму A + B = (A + B – a1 – b1, A + B, A + B + a2 + b2); ...

Перегрузка операторов - C++
Помогите, пожалуйста, с перегрузкой операторов +, &gt;=, ++ как member и friend. void main() { pQueue Obj1, Obj2; String S1, S2;...

Перегрузка операторов - C++
Создать следующие классы. В каждом классе должны быть наборы конструкторов (в том числе по умолчанию и копирования), деструктор. Для...

Перегрузка операторов - C++
Столкнулся с проблемой при написании лабораторной по перегрузке операторов. Задание таково: описать класс, содержащий координаты отрезка,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
31.01.2013, 04:13 #2
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Если можно ссылки на стандарт.
[Note: because ., .*, and :: can-not be overloaded, these operators are always built-in operators interpreted according to clause 5. ?: can-not be overloaded, but the rules in this subclause are used to determine the conversions to be applied to the second and third operands when they have class or enumeration type
Перегрузка операторов -> <-

Class member access operator-> shall be a non-static member function taking no parameters. It implements class member access using ->
postfix-expression -> id-expression
An expression x->m is interpreted as (x.operator->())->m for a class object x of type T if
T::operator->() exists and if the operator is selected as the best match function by the overload resolution mechanism.
1
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 04:23  [ТС] #3
Что должен оператор -> возвращать?
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
31.01.2013, 04:52 #4
просто для примера:
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
#include <iostream>
 
struct MyData{
    int x;
    int y;
};
 
class MyPointer{
    MyData * data;
public:
    MyPointer(MyData & x){data=&x;}
    MyData * operator->(){return data;}
    MyData & operator*(){return *data;}
};
 
int main(){
    MyData V={4,6};
    MyPointer px(V);
    std::cout<<"x = "<<V.x<<"\n"<<"y = "<<V.y<<"\n\n";
    (*px).x=45;
    (*px).y=12;
    std::cout<<"x = "<<V.x<<"\n"<<"y = "<<V.y<<"\n\n";
    px->x=10;
    px->y=25;
    std::cout<<"x = "<<V.x<<"\n"<<"y = "<<V.y<<"\n\n";
 
}
0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 12:28  [ТС] #5
Спасибо, пример хороший. Но меня интересует каким образом оператор -> возвращая указатель, без других операторов работает с х, у. Логичней было бы * ( px.operator->() ) . x или px.operator->()->x, но достаточно одного ->. Как?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
31.01.2013, 13:02 #6
Dr.Urban, у оператора -> особая семантика. При его вызове он применяется рекурсивно к результату предыдущего вызова до тех пор, пока не найдёт нужный член в очередном объекте-результате. Пример:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
 
struct Value
{
    int value;
};
 
class Foo
{
public:
    int foo;
    
    Foo(int foo):
        m_foo{foo}
    {
    }
    
    Value *operator->()
    {
        return &m_foo;
    }
    
private:
    Value m_foo;
};
 
class Bar
{
public:
    Bar(int bar):
        m_bar(bar)
    {
    }
    
    Foo operator->()
    {
        return m_bar;
    }
    
private:
    Foo m_bar;
};
 
class Moo
{
public:
    Moo(int moo):
        m_moo(moo)
    {
    }
    
    Bar operator->()
    {
        return m_moo;
    }
    
private:
    Bar m_moo;
};
 
int main()
{
    Moo moo(10);
    
    // Пройдём по всей цепочке Moo->Bar->Voo->Value, в котором найдём поле value
    std::cout << moo->value << std::endl;
    
    return 0;
}
http://liveworkspace.org/code/DbtMi$7
2
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 13:12  [ТС] #7
Идея мне нравиться и пример работает, но остался 1 вопрос.
Почему сигнатуры операторов разные?

Value *operator->() // возврат указателя
Foo operator->() // возврат по значению
Bar operator->() // возврат по значению

Выглядит как магия =)
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
31.01.2013, 13:18 #8
Dr.Urban, смотрите. В Bar перегружен оператор ->. Значит оператор -> в Moo должен возвратить Bar (чтобы компилятор подставил рекурсивный вызов оператора -> для Bar). Так же и для Bar, в нём перегружен оператор ->, возвращающий Foo, чтобы компилятор мог применить -> к объекту типа Foo. Однако когда-то же компилятор должен остановиться? Вот таким базисом и служит оператор -> в Foo, возвращающий указатель на объект типа Value. Как только мы получили указатель - компилятор применяет стандартный оператор ->, т.е. обращается именно к члену объекта типа Value, а не рекурсивно применяет определённый пользователем оператор, и наконец доходит до реального поля value, значение которого и будет результатом применения оператора -> к объекту типа Moo.
1
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 13:29  [ТС] #9
Ай красавчик! Все ясно теперь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 13:29
Привет! Вот еще темы с ответами:

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

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

Перегрузка операторов + и = - C++
Здравствуйте! У меня такой вопрос. Пишу класс подобный string. Перегрузила оператор + Line &amp;Line::operator+ (const Line&amp; right)const...

Перегрузка операторов - C++
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора «^». Оператор «^» должен возводить...


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

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

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