
- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор explicit.
- •Указатель this.
- •Абстрактные типы данных.
- •Операторы для динамического выделения и освобождения памяти (new и delete).
- •Перегрузка и переопределение функций.
- •Перегрузка бинарных операторов.
- •Перегрузка унарных операторов.
- •19.20.Перегрузка оператора new.Перегрузка оператора delete.
- •22.Inline-функции.
- •23.Вложенные классы
- •24.Static-компоненты данные класса
- •25.26.Static и const-компоненты функции класса
- •27.Использование new delete для реализации массивов
- •28.Организация внешнего доступа к локальным компонентам класса(friend)
- •29.Ссылки.Параметры ссылки
- •30.Ссылки.Независимые ссылки
- •31.Инициализация компонент-данных объекта. Конструктор с параметрами.
- •33.Наследование. Открытое, защищенное и закрытое.
- •34.Виртуальные функции.
- •35.Множественное наследование.
- •36.Множественное наследование и виртуальные базовые классы
- •38.Proxi-классы.
- •39.40.Пространство имен. Пространство имен как объявление. Пространство имен как директива.
- •41.Виртуальные функции
- •42.Параметризированные классы (шаблоны).
- •43.Шаблоны функций.
- •44.Передача в шаблон класса дополнительных параметров.
- •44.Совместное использование шаблонов и наследования.
- •45.Шаблоны класса и friend.
- •46.Реализация smart-указателя.
- •48.Транзакции.
19.20.Перегрузка оператора new.Перегрузка оператора delete.
void *operator new(size_t tip,int kol) // глобальная функция operator
{ cout << "глобальная функция NEW" <<endl;
return new char[tip*kol]; // вызов системной функции new
}
class cls
{ char a[40];
public:
cls(char *aa)
{ cout<<"конструктор класса cls"<<endl;
strcpy(a,aa);
}
~cls(){}
void *operator new(size_t,int);
void operator delete(void *);
};
void *cls::operator new(size_t tip,int n) // локальная функция operator
{ cout << "локальная функция " <<endl;
return new char[tip*n]; // вызов системной функции new
}
void cls::operator delete(void *p) // локальная функция operator
{ cout << "локальная функция DELETE" <<endl;
delete p; // вызов системной функции delete
}
void operator delete[](void *p) // глобальная функция operator
{ cout << "глобальная функция DELETE" <<endl;
delete p; // вызов системной функции delete
}
int main()
{ cls obj("перегрузка операторов NEW и DELETE");
float *ptr1;
ptr1=new (5) float; // вызов глобальной функции доопр. оператора new
delete [] ptr1; // вызов глобальной функции доопр. оператора delete
cls *ptr2=new (10) cls("aa"); // вызов локальной функции доопределения
// оператора new (из класса cls)
delete ptr2; // вызов локальной функции доопределения
return 0; // оператора delete (из класса cls)
}
22.Inline-функции.
Вызов функции означает переход к памяти, в которой расположен выполняемый код функции. Команда перехода занимает память и требует времени на ее выполнение, что иногда существенно превышает затраты памяти на хранение кода самой функции. Для таких функций целесообразно поместить код функции вместо выполнения перехода к функции. В этом случае при выполнении функции (обращении к ней) выполняется сразу ее код. Функции с такими свойствами являются встроенными. Иначе говоря, если описание
компоненты функции включается в класс, то такая функция называется встро-
енной. Например:
class stroka
{ char str[100];
public:
……..
int size()
{ for(int i=0; *(str+i); i++);
return i;
}
};
В описанном примере функция size() – встроенная. Если функция, объяв-
ленная в классе, а описанная за его пределами, должна быть встроенной, то она
описывается со спецификатором inline:
class stroka
{ char str[100];
public:
……..
int size();
};
inline int stroka ::size()
{ for(int i=0; str[i]; i++);
return i;
}
Спецификация inline может быть проигнорирована компилятором, по-
скольку иногда введение встроенных функций оказывается невозможным или
нежелательным.