Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Помогите понять код


Автор: Guest 9.10.2005, 13:44
Всем привет! Наконец-таки взялся зя изучение С++. Помогите понять следующий код:
Код

#include <iostream.h>

class CVector {
  public:
    int x,y;
    CVector () {};
    CVector (int,int);
    CVector operator + (CVector);
};

CVector::CVector (int a, int b) {
  x = a;
  y = b;
}

CVector CVector::operator+ (CVector param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return (temp);
}

int main () {
  CVector a (3,1);
  CVector b (1,2);
  CVector c;
  c = a + b;
  cout << c.x << "," << c.y;
  return 0;
}



Вроде бы всё просто , но я не понимаю почему operator+ принимает один параметр а не два , почему значения a и b не перекрывают друг друга и наконец что означает param.x?

Автор: sergejzr 9.10.2005, 14:25
Ты наверняка ни си прогал до того? smile

Добро пожаловать в ООП!

тебе наверняка знакомы структуры, так вот, class можно сравнить со структурой. Все функции обозначенные в class относятся к обьекту этого класса.
Грубо говоря в функцию передаётся указатель на сам обьект. Просто это делает компилятор и нам не надо об этом заботиться самим.

Код

/*"Обыкновенный" Си */
struct date
{
int year;
int day;
}; 

void setYear(test *this, int year)
{
this->year=year;
}
int main()
{
date d;
setYear(&d,123);
return 0;
}
//То же самое в ООП 
class date
{
int year;
int day;
void setYear(int newyear)
{
  this->year=newyear;
 //или намного короче:
 year=newyear;

}
};
int main()
{
date d();
d.setYear(123);
return 0;
}


Поэтому второй аргумент не нужен. У нас есть для этого this. Причём компилятор подставит его автоматом, если имя переменной в классе существует. Таким образом можно писать много изпользуя мало кода.

Теперь про парам smile
Посмотри на функцию
CVector CVector::operator+ (CVector param)

это переложенный оператор +
Аргументом он получает обьект класса CVector и внутри функции может пользоваться его переменными.
Опять же для сравнения:

Код

struct CVector
{
int x,y;
};
CVector create(nt x, int y)
{
this.x=x;
this.y=y;
}
CVector add(CVector param1, CVector param2)
{
CVector result;
result.x=param1.x+param2.x;
result.y=param1.y+param2.y;
return result;
};
int main()
{
CVector a=create(1,2);
CVector b=create(2,3);
CVector c=add(a,b);
return 0;
}
//ООП
class CVector
{
CVector CVector::operator+ (CVector param)
{
//Помним, что this у нас есть 
return CVector(x+param.x, y+param.y);
//альтернатива для понимания:
return CVector(this.x+param.x, this.y+param.y);
}
};
int main()
{
CVector a(1,2);
CVestor b(2,3);
CVestor с=a+b; //неправда ли, намного удобнее структур, а если представить сложное выражение, то вообще!
return 0;
}


Цитата(Guest @ 9.10.2005, 12:44)
почему значения a и b не перекрывают друг друга

Насчёт этого, не понял вопроса ....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)