Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   С++ | конструктор и operator[] (http://forum.oszone.net/showthread.php?t=52127)

Skrip 28-07-2005 18:16 344211

С++ | конструктор и 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");
}


Savant 28-07-2005 18:40 344215

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


ivank 29-07-2005 00:41 344288

Skrip
Цитата:

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

vadimiron 29-07-2005 02:18 344302

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

Skrip 29-07-2005 05:09 344311

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

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

Savant 29-07-2005 13:58 344423

Skrip
Цитата:

А каким образом компилятор догадался, что в функции operator[](int i) переменная "i"...
Тяжелый случай... Теория: с точки зрения компилятора, перегружаемые операторы есть самые обыкновенные функции. Поэтому в объявлении:
Код:

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

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

ivank 29-07-2005 13:59 344424

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 344490

Всем спасибо!

Skrip 30-07-2005 12:05 344688

Подскажите мне еще пожалуйста почему 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 344697

Skrip
Цитата:

Подскажите мне еще пожалуйста почему current_size недоступна в stlen.
Дык в дружественные функции this не передается, поэтому надо писать sttr.current_size вместо current_size

ivank 30-07-2005 19:03 344759

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

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


Время: 19:45.

Время: 19:45.
© OSzone.net 2001-