Дружественные функции.
Описатель friend предоставляет обычной функции доступ к закрытым членам класса, в котором объявлен прототип такой функции. Дружественные функции позволяют:
· Перегружать некоторые операторы
· Облегчить создание функций ввода/вывода
· Обеспечить одновременный доступ к элементов разных классов (объектов)
Ограничения:
· Не наследуются производным классов
· Не могут содержать спецификатор хранения (static (локальная переменная, сохраняющая свое значение между вызовами функций) или extern(сообщает компилятору, что следующие за ним типы и имена переменных объявляются где-то в другом месте))
class b;
class a
{
int i;
public:
void setInt (int I) { i = I; }
friend bool compare( a&, b& );
};
class b
{
double d;
public:
void setDouble (double D) { d = D; }
friend bool compare( a&, b& );
};
bool compare (a & A , b & B)
{
if(A.i > B.d)
return true;
else return false;
}
Дружественные классы.
Описатель friend позволяет определить один класс как дружественный по отношению к другому класс, при этом дружественный класс будет иметь доступ к private членам другого класс. дружественный класс не наследует члены другого класса, поэтому данную конструкцию необходимо использовать только в особых случаях.
class b;
class a
{
double d;
public:
friend class b;
};
class b
{
public:
void setDouble (a & A, double D) { A.d = D; }
double getDouble (a & A) { return A.d; }
};
void main()
{
a A;
b B;
B.setDouble(A, 1.1);
cout << B.getDouble(A);
}
Указатели на объекты. Указатель this. Передача и возврат объектов с использованием указателей. Применение базовых указателей при работе с производными типами для повышающего приведения типов.
Указатели могут работать с объектами:
· Для доступа к членам класса через указатель ислозьзуется оператор “–>”
· Адресная арифметика зависит от типа указателя (при увеличении указателя на единицу он будет иметь адрес следующего элемента этого типа)
· Указателю соответствующего типа можно присвоить адрес любого public члена объекта
· Присваивать друг другу можно лишь указатели совместных типов (но это можно преодолеть используя приведение типов – нарушение принципов строгой проверки)
При вызове функции ей неявно передается указатель на вызывающий объект – указатель this. В основном используется при перегрузке операторов для возврата адреса текущего объекта. Указатель this не передается дружественным функциям и статическим функциям-членам класса.
Указатели на объекты базового типа могут ссылаться и на объекты производного типа от этого базового типа. При этом можно получить доступ только к наследуемым (базовым) членам класса. обратное утверждение не верно – указатель на производный класс не может ссылаться на базовый класс.
Особенности:
· Если указатель на базовый класс привести к типу указателя на производный класс, то откроется доступ ко всем членам производного класса
· Если указатель на базовый класс используется для доступа к производному объекту, то увеличение указателя на единицу не даст доступ к следующему объекту производного типа
Использование указателей:
class example
{
double d;
public:
example (double D) { d = D; }
double getDouble () { return d; }
};
void main()
{
example obj = 1;
example arrObj [3] = {2, 3, 4};
example *p;
p = &obj;
cout << p->getDouble() << endl;
p = arrObj;
for (int i = 0; i < 3; i++)
{
cout << p->getDouble() << endl;
p++;
}
}
Приведение производного класса к базовому:
class base
{
public:
int a;
};
class delivered : public base
{
public:
int b;
};
void main()
{
base *B;
delivered D;
D.a = 1;
D.b = 2;
B = &D;
cout << B->a;
}
Дата добавления: 2022-02-05; просмотров: 268;