Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять код 
:(
    Опции темы
Guest
Дата 9.10.2005, 13:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

#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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Ты наверняка ни си прогал до того? 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 не перекрывают друг друга

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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.