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

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

Войти
Регистрация
Восстановить пароль
 
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

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

24.06.2012, 14:54. Просмотров 437. Ответов 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
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 )

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

Как исправить ошибку с перегруженным оператором - C++
Добрый вечер! суть задания: Необходимо реализовать класс, который умеет хранить данные произвольных типов (int, char, любой другой объект...

Указатель на объект с перегруженным оператором вывода(с наследованием) - C++
Есть два класса: строка(базовый) и комплексное число(производный). В базовом классе есть поле stri (указатель на char). В производном...

Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? - C++
В заголовочном файле &quot;klass.h&quot; есть класс: class klass { int x; public: klass(); ~klass(); void show(); friend void...

Отношения между классами и объектами - C++
Для каждого индивидуального варианта необходимо создать консольную программу на С++, реализующую отношение ассоциации (агрегации или...

Задача на тему робота с классами и объектами в С++ - C++
Класс Coins (монеты). Класс сохраняет массив из 3 монет та общее количество лицевых сторон после последнего подбрасывания . Должны быть...

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

4
DU
1483 / 1129 / 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;  
}
0
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;
}
 
*/
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.06.2012, 18:37 #4
не компилится, потому что это был код для случая, когда
Вариант, когда оператор [] возвращает указатель
у вас в коде он ссылку возвращает. я его привел на случай, если вы с указателями дружите. просто для наглядности.
1
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.06.2012, 20:38  [ТС] #5
Цитата Сообщение от DU Посмотреть сообщение
не компилится, потому что это был код для случая, когда

у вас в коде он ссылку возвращает. я его привел на случай, если вы с указателями дружите. просто для наглядности.
а все понял... дадада дурак )))) но надеюсь по скорее стать эльфом 80 уровня )
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 20:38
Привет! Вот еще темы с ответами:

Почему функция с объектами работает после того, как сработали деструкторы? - C++
Доброго времени суток! Ниже простой код с конструктором и деструктором и функцией. Когда программа работает, вызываются деструкторы, а...

Не работает с оператором вывода - C++
Я захотел проверить правильность функции rand() в С++. При выполнении программы оператор вывода просто перестает работать, ни cout, ни...

Работает ли Кириллица с классами? - C++
Почему-то всё корректно отображается на русском, кроме параметра, который выходит из класса. main.h: class Person { public: ...

Не работает прорамма с классами - C++
Не могу понять где ошыбка и как ее исправить . Друзья, помогите пожалуйста 1&gt;------ Построение начато: проект: ConsoleApplication2,...


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

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

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