Имя пользователя:
Пароль:
 

Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


пчелка, здесь все вам рады, и вашу самокритику читать мы не хотим. Лучше вместо "я плохая" ответить "я переделала так:" и привести улучшенный вариант. Я изначально писал на паскале, С/С++ изучал по книжке Старуструпа; её и советую. Что касается комментов - они нужны даже в маленькой программе (хотя бы краткое "to do"). Тем более если вы хотите чтобы в вашем коде разобрался другой человек. Про намётки и первые шаги можно было написать там же.
слово friend обозначает декларацию "друга" класса. Он будет иметь доступ к секциям private и protected, но являться внешним по отношению к классу (у функций не будет this). Пример:
Код: Выделить весь код
class A {
public:
  A(int a) : _a(a) {}
  friend void friend_foo(const A&);
  void foo(const A&);
  friend struct B;
private:
  int _a;
};

void outer_foo(const A&);

void friend_foo(const A& class_A)
{
  // доступ к this->_a:
  // неизвестная переменная _a
  _a = class_A._a + 1; // ошибка, т.к. в friend_foo не передаётся this
}

void A::foo(const A& class_A)
{
  // доступ к this->_a:
  _a = class_A._a + 1; // всё в порядке
}

void outer_foo(const A& class_A);
{
  // доступ к this->_a и class_A._a:
  // переменная _a не определена
  // нет доступа к private a._a
  _a = class_A._a + 1; // ошибка
  // вообще outer_foo отличается от friend_foo только тем, что friend_foo имеет права доступа к class_A
}

// структура B, описанная как friend, может из своим методов обращаться к скрытым членам A.
istream& operator>>(istream&, Tomat&) - это переопределение оператора сдвига для класса потока информации istream с аргументом Tomat&, который вернёт потом istream&. Вызов оператора может выглядеть так: cin >> mat; При этом так как результат сдвига - тоже istream, можно сделать так: cin >> mat >> c1; то есть прочитать 2 матрицы сподряд в одной строке кода.
То же самое с оператором <<. В стандартной библиотеке опеределены операторы сдвига потока для всех стандартных типов аргументов, и для новых типов рекомендуется доопределять. А сделать этот оператор другом нужно для доступа к скрытым членам аргумента. Хотя при продуманном дизайне класса можно обойтись и без друзей. Тогда меньше гемора при вносе изменений во внутреннюю структуру класса.

Последний раз редактировалось pva, 20-01-2010 в 21:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:22, 20-01-2010 | #5