Показать полную графическую версию : С++ | конструктор и operator[]
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");
}
Какой-то бессмысленный код тут, имхо... Да еще и с ошибками... Писать надо не delete v, а delete [] v; А про перегрузку операторов см. в учебниках по С++
>>что-то сам не могу понять как сделал
значит не сделал, а бездумно скопировал
Skrip
1.Каким образом vec узнал, что он это параметр "v", а не "с".
"он" это параметр this, который передаётся неявно. А v и c - это его поля. А про перегрузку операторов и ссылки, действительно, пишут во всех приличных учебниках.
vadimiron
29-07-2005, 02:18
Skrip
Скажие лучше, что вы хотели добиться этим кодом?? Может проблема быстрей решиться...
Savant, какую-то часть я действительно списал (только объявление класса), когда разбирал пример из учебника, НО НЕ БЕЗДУМНО. Функцию operator[] сделал сам, но как работает не понял, порадоксально но факт.
ivank, спасибо.
А каким образом компилятор догадался, что в функции operator[](int i) переменная "i" указывается между квадратными скобками ("vec[i]= 2", а не "vec[](i) = 2")
возможно сформулировал непонятно.
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))
Skrip
А каким образом компилятор догадался, что в функции operator[](int i) переменная "i" указывается между квадратными скобками ("vec[i]= 2", а не "vec[](i) = 2")Он умный. Как ни странно компилятор знает синтаксис языка C++. Если мне не изменяет память, то можно было бы написать vec.operator[](i) = 2 вместо vec[i]=2.
Подскажите мне еще пожалуйста почему 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;
};
SkripПодскажите мне еще пожалуйста почему current_size недоступна в stlen.
Дык в дружественные функции this не передается, поэтому надо писать sttr.current_size вместо current_size
Skrip
Переменная current_size должна быть локальной в stlen, а не private-полем.
А ещё лучше sttr в функциб передавать по константной ссылке. Дабы избежать проблем с накладными расходами на копирование.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.