С++ | конструктор и operator[]

Аватара пользователя
Skrip

С++ | конструктор и operator[]

Сообщение Skrip »

1.Каким образом vec узнал, что он это параметр "v", а не "с".

2. Почему если в operator`e[] написать return с, все работает точно также как и при return v; и вообще как работает operator[], что-то сам не могу понять как сделал. Почему vec[2] = 4 работает (вроде понимаю, но нужно слово того кто знает!)?





Код:

Код: Выделить всё

 #include 
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 
Аватара пользователя
Savant

Re: С++ | конструктор и operator[]

Сообщение Savant »

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

>>что-то сам не могу понять как сделал

значит не сделал, а бездумно скопировал
Аватара пользователя
ivank

Re: С++ | конструктор и operator[]

Сообщение ivank »

Skrip

Переменная current_size должна быть локальной в stlen, а не private-полем.



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

Re: С++ | конструктор и operator[]

Сообщение ivank »

Skrip


Цитата:



1.Каким образом vec узнал, что он это параметр "v", а не "с".



"он" это параметр this, который передаётся неявно. А v и c - это его поля. А про перегрузку операторов и ссылки, действительно, пишут во всех приличных учебниках.
Аватара пользователя
vadimiron

Re: С++ | конструктор и operator[]

Сообщение vadimiron »

Skrip

Скажие лучше, что вы хотели добиться этим кодом?? Может проблема быстрей решиться...
Аватара пользователя
Skrip

Re: С++ | конструктор и operator[]

Сообщение Skrip »

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

ivank, спасибо.



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

возможно сформулировал непонятно.
Аватара пользователя
Savant

Re: С++ | конструктор и operator[]

Сообщение Savant »

Skrip
Цитата:



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



Тяжелый случай... Теория: с точки зрения компилятора, перегружаемые операторы есть самые обыкновенные функции. Поэтому в объявлении:



Код:

Код: Выделить всё

int & vector::operator [] (int i) ;

int& - тип возвращаемого значения,

operator[] - имя функции,

int i - тип и количество аргументов.

Другое дело, что вызывается она немного по-другому... А именно так, как это определено в синтаксисе конкретного операнда.



Если у Вас в учебнике про это ни слова, смените учебник. Или прочтите
эту статью
(первое, что нашлось
в гугле
)
Аватара пользователя
ivank

Re: С++ | конструктор и operator[]

Сообщение ivank »

Skrip


Цитата:



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



Он умный. Как ни странно компилятор знает синтаксис языка C++. Если мне не изменяет память, то можно было бы написать vec.operator[](i) = 2 вместо vec=2.
Аватара пользователя
Skrip

Re: С++ | конструктор и operator[]

Сообщение Skrip »

Подскажите мне еще пожалуйста почему current_size недоступна в stlen.



Код:

Код: Выделить всё

#include 
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;
};
Ответить

Вернуться в «Программирование и базы данных»