
- •Класс и атд
- •Классификация методов
- •Действия над объектами
- •Способы задания доступа
- •Область видимости класса
- •Указатель this
- •Функции-члены типа static и const
- •Перегрузка операторов
- •Доступные и недоступные для перегрузки операторы:
- •Перегрузка обычными функция, как компонентными
- •Примеры перегрузки операторов:
- •56. Параметрический полиморфизм: шаблонные классы и шаблонные функции - назначение, параметризованные типы данных, синтаксис и семантика.
Указатель this
Ключевое слово this обозначает объявленный неявно указатель на себя. Он может использоваться только в нестатических функциях-членах. В статических функциях-членах неявные аргументы недопустимы. Простая иллюстрация использования указателя this приведена ниже.
В файле cpair.cpp
//Указатель this
class c_pair { public:
void init(char b) { c2 = 1 + (cl = b) ; }
c_pair increment() { cl++; c2 + +; return (*this); }
c_pair* where_am__I () { return this; }
void print() { cout << cl << c2 « '\t'; } private:
char cl, c2;
int main() {
c_pair a, b;
a.init{'A');
a.print();
cout << " is at " « a.where_am_I() << endl.
b.init('B');
b.print();
cout << “at” << b.where_am_I() <<end.
Функция-член increment использует неявный указатель this, чтобы возвратить приращенные значения с1ис2. Функция-член where_am I возвращает адрес заданного объекта. Ключевое слово this предоставляет встроенный не требующий объявления указатель. Это то же самое, как если бы в c_pair неявно объявлялся закрытый член c_pair* const this. Указатель this нельзя изменить.
Функции-члены типа static и const
Функция-член класса, объявленная с ключевым словом static, будет иметь глобальную область видимости. В отличие от других функций-членов, статический метод не будет получать указатель на текущий объект и соотвественно не может быть объявлен со спецификаторами const или virtual, по этой же причине статические методы не имеют прямого доступа к нестатическим полям класса. //Расчет зарплаты с использованием
Назначение модификатора const в объявлении функций-членов – определить, какие из них можно вызывать для константных объектов. Такие функции-члены важны по двум причинам. Во-первых, они облегчают понимание интерфейса класса, ведь полезно сразу видеть, какие функции могут модифицировать объект, а какие нет. Во-вторых, они обеспечивают возможность работать с константными объектами. Это очень важно для написания эффективного кода, потому что, как объясняется в правиле 20, один из основных способов повысить производительность программ на C++ – передавать объекты по ссылке на константу. Но эта техника будет работать только в случае, когда функции-члены для манипулирования константными объектами объявлены с модификатором const. Функции, отличающиеся только наличием const в объявлении, могут быть перегружены.
//static и const функций-членов.
#include <iostream.h>
class salary {
private:
int b_sal;
int your_bonus;
static int all_bonus; //объявление
public:
salary(int b) : b_sal(b) { }
void calc_bonus(double perc) {your_bonus = b_sal * perc;}
static void reset_all(int p) {all_bonus = p; }
int comp_tot() const
{ return (b_sal + your_bonus + all_bonus); }
};
int salary::all_bonus = 100; //объявление и определение
main()
{
salary w1(1000), w2(2000);
w1.calc_bonus(0.2);
w2.calc_bonus(0.15);
salary::reset_all(400); //эквивалентно w1.reset_all(400);
cout << " w1 " << w1.comp_tot() << " w2 " << w2.comp_tot()
<< "\n";
}
Статический член all_bonus требует объявления в контексте файла. Он существует независимо от любых объявляемых специфических переменных типа salary. На статический член также можно ссылаться так: salary::all_bonus
Модификатор const появляется между концом списка параметров и началом тела кода. Он указывает, что все члены-данные не будут изменять свои значения. Это также делает код более надежным. В результате самоссылочный указатель передается как const salary* const this. Функция-член static может вызываться с оператором разрешения контекста или с использованием специфического объекта. Следовательно,
salary::reset_all(400); w1.reset_all(400); (&w2) -> reset_all(400); эквивалентны.
М
етодика
тестирования объектно-ориентированных
программ:
На первом уровне проводится тестирование методов каждого класса программы, что соответствует этапу модульного тестирования.
На втором уровне тестируются методы класса, которые образуют контекст интеграционного тестирования каждого класса.
На третьем уровне протестированный класс включается в общий контекст (дерево классов) программного проекта. Здесь становится возможным отслеживать реакцию программы на внешние события.
Айра Пол «Объектно-ориентированное программирование на С++»
Лекции Ершова Е.В.
54. Создание и уничтожение объектов: конструкторы – назначение; наличие нескольких конструкторов у одного класса - причины, разделение функций; способы задания конструктора - по умолчанию или явное; вызов конструктора - назначение, способы реализации, задание аргументов; явный и автоматический вызовы - ситуации использования, рекомендации по применению; деструкторы - назначение, основные свойства; способы задания - по умолчанию или явное; вызов деструктора - назначение, способы реализации; явный и автоматический вызовы - ситуации использования, рекомендации по применению; отладка и тестирование системы конструкторов и деструкторов.
Конструктор - функция-член, имя которой совпадает с именем класса. Он создает объекты типа класса. Это включает инициализацию членов-данных, распределение свободной памяти, использующее new.
Виды конструкторов:
конструктор по умолчанию — не имеет параметров, или имеет, но значения задаются по умолчанию;
конструктор копирования — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него);
конструктор преобразования — Конструктор, принимающий один аргумент. Задаёт преобразование типа своего аргумента в тип конструктора. Такое преобразование типа неявно применяется только если оно уникально.
Конструктор инициализации – инициализирует поля объектов начальными значениями.
Вызов конструкторов
При объявлении объекта.
Type x; - конструктор по умолчанию;
Type y("Фамилия","Имя") – конструктор с параметрами (инициализации).
Копирование содержимого объекта в другой, такого же типа
Void f (type a) {…} – внешняя функция
F(x); - содержимое x копируется в a;
явный вызов конструктора
x.type();
4. возвращаемый объект создается конструктором
Type ff()
{type t; … return t;}
Деструктор - функция-член с именем, таким же, как и имя класса, которому предшествует символ ~ (тильда). Обычная его цель состоит в том, чтобы удалять значения типа класса. Это обычно выполняется путем применения delete.
Деструкторы вызываются в порядке, обратном конструкторам.
Вызовы конструктора:
Не явный вызов:
Void f()
{
Type *p;
…
Delete p;
}
Явный вызов
Class super_type
{
Type x,y,z;
…
x.~type();
}
Лекции Ершова Е.В.
55. Специальный полиморфизм: перегрузка функций, алгоритм выбора перегруженной функции, дружественные функции, перегрузка операторов - синтаксис, семантика, приоритет и порядок выполнения, доступные и недоступные для перегрузки операторы, перегружаемые как обычные функции, только как компонентные функции.
Перегрузка и выбор функций
Перегруженные функции – это функции, которые имеют одинаковое имя, но отличатся списком параметров (количество параметров, их тип, порядок следования). Конкретная функция выбирается в зависимости от соответствия списка аргументов при вызове функции списку параметров в объявлении функции. Когда вызывается перегруженная функция, компилятор должен иметь алгоритм для выбора надлежащей функции. Алгоритм, который выполняет этот выбор, зависит от того, преобразования какого типа присутствуют. Наилучшее соответствие должно быть уникальным.
Алгоритм выбора перегруженной функции
Использовать строгое соответствие (если возможно).
Попробовать.стандартное повышение типа (float в double).
Попробовать стандартное преобразование типа.
Попробовать определяемое пользователем преобразование.
Использовать, если возможно, соответствие эллипсису (подразумеваемому аргументу).
В C++ существуют четыре приведения типов:
static_cast<Ti*n> (выражение)
reinterpret_cast<THrr> (выражение)
const_cast<Tnn>{выражение)
dynamic__cast<THn> (выражение)
Дружественные функции
Ключевое слово friend (друг) дает функции-не-члену доступ к скрытым членам класса и предоставляет способ для обхода огр-ий сокрытия данных в C++.
Одна из причин использования дружественных функции состоит в том, что некоторые функции нуждаются в привилегированном доступе к более чем одному классу. Вторая причина в том, что дружественные функции передают все свои аргументы, список аргументов.
Дружественная функция должна быть объявлена внутри объявления класса, по отношению к которому она является дружественной (с которым она дружит), Функция предваряется ключевым словом friend и может встречаться в любой части класса; это не влияет на ее смысл.
Функция-член одного класса мб дружественной другому классу. В этом случае для указания ее имени в дружественном классе используется оператор разрешения области видимости. То, что все функции-члены одного класса являются дружественными функциями другого класса, может быть указано как friend class имя_класса.
class tweedledee {
//дружественная функция //функция-член
class tweedledum {
friend int tweedledee::Cheshire();
friend void alice( int Cheshire);
class tweedledumber {
friend class tweedledee; //все функции-члены из tweedledee получают доступ
Дружественные функции создают некую двойственность. Они имеют доступ к закрытым членам, не являясь при этом функциями-членами. Их можно использовать для быстрых исправлений в коде, которому необходим доступ к реализации деталей класса.