- •Базовое ядро языка Элементы программы.
- •Комментарии
- •Инструкция – выражение
- •Инструкция
- •Определение функции
- •Заголовок функции
- •Прототипы функций
- •Аргументы по умолчанию.
- •Перегрузка функций
- •Встраиваемые функции
- •Стек до блока Вошли в блок Вышли из блока
- •Индексирование
- •Int a [100]; одномерный массив
- •Int b [3][5]; двухмерный массив
- •Int c [7][9][2]; трехмерный массив
- •Передача массивов функциям
- •Объявления ссылок и вызовов по ссылке
- •Функции-члены класса
- •Доступ: закрытый и открытый
- •Область видимости класса
- •Оператор разрешения области видимости ::
- •Вложенные классы
- •Статические члены данных
- •Указатель this
- •Функции-члены типа static и const.
- •Изменчивость (mutable)
- •Создание и уничтожение объектов
- •Классы с конструкторами
- •Конструкторы как преобразования
- •Создание динамического стека
- •Классы с деструкторами
- •Пример: динамически размещаемые строки
- •Ad hoc полиморфизм
- •Алгоритм выбора перегруженной функции
- •Перегрузка операторов
- •Перегрузка бинарных операторов
- •Перегрузка операторов присваивания и индексирования
- •Перегруженные операторы ввода-вывода « и »
- •Перегрузка оператора ( ) для индексирования
- •Операторы указателей
- •Указатель на член класса
- •Перегрузка new и delete
- •Наследование.
- •Методология объективно-ориентированного проектирования
- •Виртуальные функции
- •Абстрактные базовые классы
Функции-члены класса
Концепция struct расширена в С ++ так, что функции могут быть членами структур. Объявление функции включается в объявление структуры и эта функция вызывается с использованием методов доступа, которые определены для членов структуры.
struct ch_stack { // представление данных int top;
enum {max_len = 100, EMPTY = -1, FULL = max_len -1}; char s [max_len];
//операции, представленные как функции-члены
void reset ( ) {top = EMPTY; } void push (char c) {top ++; s [top] = c;}
char pop ( ) {return s [top--];} char top_of ( ) {return s [top]; }
bool empty ( ) {return (top = = EMPTY) ;} bool full ( ) {return (top = = FULL) ;}
};
Функции-члены (member function) записаны подобно обычным функциям. Единственное отличие состоит в том, что они могут использовать имена членов класса « как есть ». Так, функции-члены ch_stack используют переменные top и s без явного указания имени структуры. При вызове функций-членов применительно к конкретному объекту типа ch_stack они действуют на указанные члены данных именно этого объекта.
Функции-члены, которые определены внутри struct, являются неявно встраиваемыми. Как правило, только короткие, интенсивно используемые функции-члены должны определяться внутри struct, как в только что приведенном примере. Чтобы определить функцию-член вне struct, используется оператор разрешения области видимости (scope resolution) . используя оператор разрешения области видимости. В этом случае функция уже не будет неявно встраиваемой.
struct ch_stack { // предоставление данных int top;
enum {max_len = 100, EMPTY = -1, FULL = max_len -1}; char s [max_len];
// операции, представленные как функции-члены
void reset ( ) {top = EMPTY; } //неявно встроенная функция
void push (char c) ; //прототип функции
….. };
void ch_stack : : push (char c)//определение невстроенной функции
{ top ++; s [top] = c; }
Оператор разрешения области видимости позволяет функциям-членам из разных типов struct иметь одинаковые имена. То, какая именно функция-член вызывается, зависит от типа объекта, на который она направлена. Функции-члены внутри одной структуры могут быть перегружены.
struct ch_stack {….. char pop (int n); // в пределах ch_stack
….. }; char ch_stack : : pop (int n)
{ while (n-- > 1) top--; return s [top--] }
Что конкретно будет вызвано, зависит от текущих аргументов функции pop:data. pop ( ); // вызывает стандартный рор data. pop (5); // вызывает многократный рор
Доступ: закрытый и открытый
Понятие структуры расширено в С ++, так что появилась возможность вводить закрытые и открытые члены данных функции-члены. Внутри структуры использование ключевого слова private с последующим двоеточием ограничивает доступ к членам, которые идут за этой конструкцией. Закрытые члены могут использоваться лишь некоторыми категориями функций. Таковыми являются функции-члены структур. struct ch_stack {
public: void reset ( ) {top = EMPTY; } void push (char c) {top ++; s [top] = c; }
char pop ( ) { return s [top]; } char top_of ( ) { return s [top]; }
bool empty ( ) { return (top = = EMPTY); }bool full ( ) { return (top = = FULL); }
private: enum {max_len= 100, EMPTY = -1, FULL = max_len -1};
char s [max_len]; int top; };
Как указано в комментарии, доступ к скрытой переменной top ограничен. Она может быть изменена с помощью функции-члена reset ( ) , но к top нельзя обратиться напрямую. как переменная s передается каждой функции-члену с использованием оператора выбора члены структуры.
Структура ch_stack имеет закрытую часть, содержащую описания данных, и открытую часть, содержащую функции-члены, необходимые для осуществления операций в ch_stack..
Классы
В С++ классы вводятся ключевым словом class. Они являются формой структуры, права доступа к членам которой по умолчанию определены как закрытые (private). Таким образом, struct и class взаимозаменяемы, но необходимо определять надлежащие права доступа.
Давайте перепишем пример с комплексными числами:
struct complex { public: void assign (double r, double i); void print ( )
{ cout << real << “+” << imag << “i”;}
private: double real, imag; };
inline void complex : : assign (double r, double I = 0.0)
{ real = r; imag = i; }
А вот эквивалентное представление класса:
class complex { public: //стиль «должен знать»,
void assign (double r, double i); //см. ниже
void print ( )
{ cout << real << “+” << imag << “i”;}
private: double real, imag; };
inline void complex : : assign (double r, double i = 0.0)
{ real = r; imag = i; }
Здесь используется тот факт, что по умолчанию доступ к членам класса является закрытым.