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

Как работает ссылка с объектами, классами и перегруженным оператором [] - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.06.2012, 14:54     Как работает ссылка с объектами, классами и перегруженным оператором [] #1
Я тут решил поиграться с кодом и понял что совершенно не догоняю как работает ссылка &
Есть код нормально работающий:

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
#include <sstream>
#include <iostream>
using namespace std;
class Point
{
protected:
    double m_x;                                
    double m_y;                                
public:
    
    Point(): m_x(0), m_y(0) {};                            
    Point(double new_x, double new_y) : m_x(new_x), m_y(new_y) {};
    friend ostream& operator << (ostream& os, const Point& point)
{
    return os << point.ToString();
}
   string ToString() const
{
      std::ostringstream os; 
    os << m_x << " , " << m_y; 
    std::string double_string = os.str();
 
    return "Point(" + double_string + ")";
}
};
class ArrayStack 
{    
    private:        
        
        Point* data;       
        int top;    
  public:        
      ArrayStack() :top(10), data(new Point[10]) {} 
      ArrayStack(int m_top) : top(m_top), data(new Point[m_top]) {} 
 
       int Size() 
    {
        return top+1;
    }
  Point& operator [] (int index)
  {
    if (index >= this->top)
    {
        cout << "i am hreeeee" << endl;
        return this->data[0];
    }
    return data[index];
}
};
int main()
{    
    ArrayStack s(5); 
        for(int i=0; i<s.Size()-1; i++) 
        {
        s[i] = Point(2*i, 2*i);
        cout << s[i] <<" index of element: " << i << endl;  
        }
    return 0;
}
OUTPUT:
Point (0,0 )
Point (1,1 )
Point (2,2 )
Point (3,3 )
Point (4,4 )

из строки номер 40 убрать ссылку , т.е.
C++
1
 Point operator [] (int index)
OUTPUT:
Point (0,0 )
Point (0,0 )
Point (0,0 )
Point (0,0 )
Point (0,0 )

Объясните, пожалуйста, быдло кодеру (т.е. мне) почему так происходит ((( желательно на пальцах
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2012, 14:54     Как работает ссылка с объектами, классами и перегруженным оператором []
Посмотрите здесь:

C++ Не работает с оператором вывода
Не работает ссылка на структуру C++
Ссылка, Указатель, Область памяти выделенная оператором new для указателя C++
Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? C++
Как исправить ошибку с перегруженным оператором C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.06.2012, 16:04     Как работает ссылка с объектами, классами и перегруженным оператором [] #2
Вот эквивалентный код:
C++
1
2
3
4
5
6
7
8
9
10
11
for(int i=0; i<s.Size()-1; i++) 
{
  Point p = s[i];
  p = Point(2*i, 2*i);
  // вот это присваивание локальной переменной.
  // То, что находится в StackArray при этом не изменяется, т.е. там точки с нулевыми координатами
  // как были, так и остались без изменения
 
  // Далее идет вывод этих точек с нулевыми координатами
  cout << s[i] <<" index of element: " << i << endl;  
}
Ссылка по внутреннему устройству не отличается от указателей. Разница лишь в синтаксисе и
правилах инициализации. Далее варианты кода с ссылкой и с указателем:

C++
1
2
3
4
5
6
7
8
9
for(int i=0; i<s.Size()-1; i++) 
{
  Point& p = s[i];
  p = Point(2*i, 2*i);
  // вот это присваивание тому, на что ссылается p (ссылается на iый элемент в стеке).
  // То, что находится в StackArray в iой позиции при этом изменяется на Point(2*i, 2*i);
 
  cout << s[i] <<" index of element: " << i << endl;  
}
Вариант, когда оператор [] возвращает указатель
C++
1
2
3
4
5
6
7
8
9
for(int i=0; i<s.Size()-1; i++) 
{
  Point* p = s[i];
  *p = Point(2*i, 2*i);
  // вот это присваивание тому, на что указывает p (указывает на iый элемент в стеке).
  // То, что находится в StackArray в iой позиции при этом изменяется на Point(2*i, 2*i);
 
  cout << *s[i] <<" index of element: " << i << endl;  
}
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.06.2012, 18:31  [ТС]     Как работает ссылка с объектами, классами и перегруженным оператором [] #3
Цитата Сообщение от DU Посмотреть сообщение
Вот эквивалентный код:
C++
1
2
3
4
5
6
7
8
9
10
11
for(int i=0; i<s.Size()-1; i++) 
{
  Point p = s[i];
  p = Point(2*i, 2*i);
  // вот это присваивание локальной переменной.
  // То, что находится в StackArray при этом не изменяется, т.е. там точки с нулевыми координатами
  // как были, так и остались без изменения
 
  // Далее идет вывод этих точек с нулевыми координатами
  cout << s[i] <<" index of element: " << i << endl;  
}
Ссылка по внутреннему устройству не отличается от указателей. Разница лишь в синтаксисе и
правилах инициализации. Далее варианты кода с ссылкой и с указателем:

C++
1
2
3
4
5
6
7
8
9
for(int i=0; i<s.Size()-1; i++) 
{
  Point& p = s[i];
  p = Point(2*i, 2*i);
  // вот это присваивание тому, на что ссылается p (ссылается на iый элемент в стеке).
  // То, что находится в StackArray в iой позиции при этом изменяется на Point(2*i, 2*i);
 
  cout << s[i] <<" index of element: " << i << endl;  
}
Вариант, когда оператор [] возвращает указатель
C++
1
2
3
4
5
6
7
8
9
for(int i=0; i<s.Size()-1; i++) 
{
  Point* p = s[i];
  *p = Point(2*i, 2*i);
  // вот это присваивание тому, на что указывает p (указывает на iый элемент в стеке).
  // То, что находится в StackArray в iой позиции при этом изменяется на Point(2*i, 2*i);
 
  cout << *s[i] <<" index of element: " << i << endl;  
}


Очень глупый капитаночевидский вопрос я правильно понимаю что между 2м и 3м случаем разницы нет... только в синтаксисе

Добавлено через 1 час 24 минуты
Цитата Сообщение от Leeto Посмотреть сообщение
Очень глупый капитаночевидский вопрос я правильно понимаю что между 2м и 3м случаем разницы нет... только в синтаксисе
чот не компелиться последний вариант


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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <sstream>
#include <iostream>
using namespace std;
class Point
{
protected:
    double m_x;                                
    double m_y;                                
public:
    
    Point(): m_x(0), m_y(0) {};                            
    Point(double new_x, double new_y) : m_x(new_x), m_y(new_y) {};
    friend ostream& operator << (ostream& os, const Point& point)
{
    return os << point.ToString();
}
   string ToString() const
{
      std::ostringstream os; 
    os << m_x << " , " << m_y; 
    std::string double_string = os.str();
 
    return "Point(" + double_string + ")";
}
};
class ArrayStack 
{    
    private:        
        
        Point* data;       
        int top;    
  public:        
      ArrayStack() :top(10), data(new Point[10]) {} 
      ArrayStack(int m_top) : top(m_top), data(new Point[m_top]) {} 
      void Swap(ArrayStack& ar)
     {
  Point* data = data;
  int   size = top;
  data = ar.data;
  top = ar.top;
  ar.data = data;
  ar.top = size;
     }
      ArrayStack& operator=(const ArrayStack& ar)
      {
 
  if(this == &ar) {return *this;}
  ArrayStack copy(ar); 
  this->Swap(copy); 
  return *this;
    }
 
 
       int Size() 
    {
        return top+1;
    }
  Point& operator [] (int index)
  {
    if (index >= this->top)
    {
        cout << "i am hreeeee" << endl;
        return this->data[0];
    }
    return data[index];
}
};
 
int main ()
        {
    ArrayStack* s;
 
for(int i=0; i<s.Size-1; i++) 
{
  Point* p = s[i];
  *p = Point(2*i, 2*i);
  cout << " вот это присваивание тому, на что указывает p (указывает на iый элемент в стеке)." << endl;
    cout << " То, что находится в StackArray в iой позиции при этом изменяется на Point(2*i, 2*i);" << endl;
 
  cout << *s[i] <<" index of element: " << i << endl;  
}
 
return 0;
}
 
/*
int main()
{    
    ArrayStack s(5); 
        for(int i=0; i<s.Size()-1; i++) 
        {
        s[i] = Point(1*i, 1*i);
        cout << s[i] << endl;   
        }
    return 0;
}*/
 
 
/*
int main (int argc,char*argv[])
        {
    ArrayStack s;
 
for(int i=0; i<s.Size()-1; i++) 
    {
  Point p = s[i];
  p = Point(2*i, 2*i);
  cout << " вот это присваивание локальной переменной." << endl;
  cout << "  То, что находится в StackArray при этом не изменяется, т.е. там точки с нулевыми координатами " << endl;
  cout << "  как были, так и остались без изменения " << endl;
 
  // Далее идет вывод этих точек с нулевыми координатами
  cout << s[i] <<" index of element: " << i << endl;  
}
return 0;
}*/
 
/*
int main ()
        {
    ArrayStack s;
 
for(int i=0; i<s.Size()-1; i++) 
{
  Point& p = s[i];
  p = Point(2*i, 2*i);
  cout << " вот это присваивание тому, на что ссылается p (ссылается на iый элемент в стеке). " << endl;
  cout << " То, что находится в StackArray в iой позиции при этом изменяется на Point(2*i, 2*i); " << endl;
 
  cout << s[i] <<" index of element: " << i << endl;  
}
 
return 0;
}
 
*/
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.06.2012, 18:37     Как работает ссылка с объектами, классами и перегруженным оператором [] #4
не компилится, потому что это был код для случая, когда
Вариант, когда оператор [] возвращает указатель
у вас в коде он ссылку возвращает. я его привел на случай, если вы с указателями дружите. просто для наглядности.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.06.2012, 20:38  [ТС]     Как работает ссылка с объектами, классами и перегруженным оператором [] #5
Цитата Сообщение от DU Посмотреть сообщение
не компилится, потому что это был код для случая, когда

у вас в коде он ссылку возвращает. я его привел на случай, если вы с указателями дружите. просто для наглядности.
а все понял... дадада дурак )))) но надеюсь по скорее стать эльфом 80 уровня )
Yandex
Объявления
24.06.2012, 20:38     Как работает ссылка с объектами, классами и перегруженным оператором []
Ответ Создать тему
Опции темы

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