Другие языки программирования и технологии

С++ пару вопросов о ООП

4)Когда следует переопределять операторы с помощью дружественных функций, а когда с помощью функций элементов класса? 5)Что происходит при присваивании одного объекта другому (без переопределенной операции =) и какие побочные эффекты могут возникнуть? 15)Объясните, что означает ключевое слово protected. (Рассмотрите два случая: когда оно используется для задания элементов класса и когда оно используется в качестве спецификатора доступа.) 16)Что такое чистая виртуальная функция? Что такое абстрактный класс? 19)Приведите общую форму перегрузки бинарной операторной функции-члена. Спасибо.
4) Когда что проще
class A
{
A& opretator+=(const A& x)
{
// проще в классе, к объекту что то приплюсовать;
return *this;
}
};

// проще вне класса, делать дружественным нет необходимости.
A operator+(const A &x, const A &y)
{
A r(x);
return r += y;
}

5) Тупо копирируется область памяти, занимаемая объектом, в область памяти другого объекта. Побочные эффекты возникают в классах, объектам которых требуются допонительные ресурсы. При создании объект запрашивает (выделяет) это ресурс, при удалении - освобождает. Например динамически выделяемая память. Объект содержит указатель на эту память. При присваивании обного объекта другому нужно не скопировать значение указателя, а скопировать память, на которую тот указывает. Если этого не сделать, то оба объекта будут иметь указатель на один и тот же ресурс. После удаления одного из них второй выдаст глюк, потому что первый уже освободил этот ресурс.

15) public - открытый доступ к переменным-членам и функциям-членам класса. Везде и всем можно это трогать.
protected - защищенный доступ (ограниченный) . Можно трогать изнутри класса, изнутри производных классов, и из "друзей" класса
private - закрытый доступ. Можно трогать только изнутри класса и из "друзей" класса.
"друзья" объявляются внутри класса, извне записаться в друзья нельзя.

19) операторы разные бывают
class B
{
LPSTR m_lpName;

public:
operator LPCSTR() const { return m_lpName; }
};

позволяет пользоваться объектом как указателем const char*
B b;
strlen(b);
Александр Богданов
Александр Богданов
21 360
Лучший ответ