Войти

Показать полную графическую версию : С++ | конструктор и operator[]


Skrip
28-07-2005, 18:16
1.Каким образом vec узнал, что он это параметр "v", а не "с".
2. Почему если в operator`e[] написать return с[i], все работает точно также как и при return v[i]; и вообще как работает operator[], что-то сам не могу понять как сделал. Почему vec[2] = 4 работает (вроде понимаю, но нужно слово того кто знает!)?

#include <iostream.h>
class vector
{
int* v;
int* c;
public:
vector (int);
~vector ();
int& operator[] (int);
};
vector::vector (int s)
{
v = new int [s];
c = new int [s];
};
vector::~vector()
{delete v;
delete c;};
int& vector::operator[](int i)
{
return v[i];
};

vector vec(10);
main ()
{
vec[2] = 6;
cout << vec[2];
system("pause");
}

Savant
28-07-2005, 18:40
Какой-то бессмысленный код тут, имхо... Да еще и с ошибками... Писать надо не delete v, а delete [] v; А про перегрузку операторов см. в учебниках по С++
>>что-то сам не могу понять как сделал
значит не сделал, а бездумно скопировал

ivank
29-07-2005, 00:41
Skrip
1.Каким образом vec узнал, что он это параметр "v", а не "с".
"он" это параметр this, который передаётся неявно. А v и c - это его поля. А про перегрузку операторов и ссылки, действительно, пишут во всех приличных учебниках.

vadimiron
29-07-2005, 02:18
Skrip
Скажие лучше, что вы хотели добиться этим кодом?? Может проблема быстрей решиться...

Skrip
29-07-2005, 05:09
Savant, какую-то часть я действительно списал (только объявление класса), когда разбирал пример из учебника, НО НЕ БЕЗДУМНО. Функцию operator[] сделал сам, но как работает не понял, порадоксально но факт.
ivank, спасибо.

А каким образом компилятор догадался, что в функции operator[](int i) переменная "i" указывается между квадратными скобками ("vec[i]= 2", а не "vec[](i) = 2")
возможно сформулировал непонятно.

Savant
29-07-2005, 13:58
SkripА каким образом компилятор догадался, что в функции operator[](int i) переменная "i"...
Тяжелый случай... Теория: с точки зрения компилятора, перегружаемые операторы есть самые обыкновенные функции. Поэтому в объявлении:
int & vector::operator [] (int i) ;

int& - тип возвращаемого значения,
operator[] - имя функции,
int i - тип и количество аргументов.
Другое дело, что вызывается она немного по-другому... А именно так, как это определено в синтаксисе конкретного операнда.

Если у Вас в учебнике про это ни слова, смените учебник. Или прочтите эту статью (http://ilyabirman.ru/misc/overload/index.htm) (первое, что нашлось в гугле (http://www.google.com/search?q=%D0%BF%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0+%D0%BE%D0%BF%D0%B5%D1%80%D0%B0 %D1%82%D0%BE%D1%80%D0%BE%D0%B2+%D0%B2+(C%2B%2B+OR+%D0%A1%2B%2B)&sourceid=opera&num=0&ie=utf-8&oe=utf-8))

ivank
29-07-2005, 13:59
Skrip
А каким образом компилятор догадался, что в функции operator[](int i) переменная "i" указывается между квадратными скобками ("vec[i]= 2", а не "vec[](i) = 2")Он умный. Как ни странно компилятор знает синтаксис языка C++. Если мне не изменяет память, то можно было бы написать vec.operator[](i) = 2 вместо vec[i]=2.

Skrip
29-07-2005, 17:32
Всем спасибо!

Skrip
30-07-2005, 12:05
Подскажите мне еще пожалуйста почему current_size недоступна в stlen.
#include <iostream.h>
class m_string
{
friend int stlen (m_string);
public:
m_string();
m_string(int);
~m_string();
char operator[](int i){return str[i];};
m_string operator= (char* cr);

private:
int mas_size, current_size;
char* str;
};



extern int stlen (m_string sttr)
{
while (sttr[current_size] != '\0')
{current_size++;};
return current_size;
};

Savant
30-07-2005, 12:58
SkripПодскажите мне еще пожалуйста почему current_size недоступна в stlen.
Дык в дружественные функции this не передается, поэтому надо писать sttr.current_size вместо current_size

ivank
30-07-2005, 19:03
Skrip
Переменная current_size должна быть локальной в stlen, а не private-полем.

А ещё лучше sttr в функциб передавать по константной ссылке. Дабы избежать проблем с накладными расходами на копирование.




© OSzone.net 2001-2012