
- •1. Введение
- •2. Элементы языка
- •2.1. Первые программы
- •2.2. Алфавит языка
- •2.3. Комментарии
- •2.4. Типы данных
- •2.5. Целые типы данных
- •2.6. Плавающие типы данных
- •2.7. Константы-строки, или литералы
- •2.8. Директива препроцессора define
- •2.9. Описания
- •2.10. Модификатор const
- •3. Выражения
- •3.1. Операция и выражение присваивания
- •3.2. Арифметические операции
- •3.3. Операции отношения
- •3.4. Логические операции
- •3.5. Побитовые операции
- •3.6. Сдвиги
- •?????3.8. Тернарная или условная операция
- •3.9. Операция следования
- •3.10. Приоритеты операций и порядок вычисления
- •4.6. Оператор выбора switch
- •4.7. Оператор цикла while
- •4.8. Цикл с постусловием do-while
- •4.9. Оператор for
- •4.10. Оператор безусловного перехода
- •4.11. Оператор break
- •4.12. Оператор continue
- •4.13. Оператор return
- •5. Указатели
- •5.1. Определение указателей
- •5.2. Указатели и массивы
- •5.3. Адресная арифметика
- •5.4. Символьные массивы и строки
- •5.5. Многомерные массивы
- •5.6. Указатели и многомерные массивы
- •6. Операция sizeof
- •7. Операции для работы с динамической памятью
- •7.1. Операция выделения памяти new
- •7.2. Операция освобождения памяти delete
- •8. Функции
- •8.1. Определение и вызов функции
- •8.2. Функции. Передача аргументов
- •8.3. Передача многомерных массивов
- •8.4. Указатели на функции
- •8.5. Ссылки
- •8.6. Ссылки в качестве параметров функций
- •8.7. Аргументы по умолчанию
- •8.8. Переопределение функций
- •8.9. Шаблоны функций
- •9. Объявления и определения
- •10. Область существования имени
- •11. Область видимости
- •Здесь будет напечатано
- •12. Классы памяти
- •13. Объявления объектов и типов
- •14. Имена типов
- •15. Синоним имени типа
- •16. Правила преобразования стандартных типов
- •16.1. Явные преобразования
- •16.2. Неявные преобразования стандартных базовых типов
- •16.3. Преобразование производных стандартных типов
- •17. Перечисления
- •18. Классы
- •18.1. Объявление классов
- •18.2. Конструкторы
- •18.3. Деструкторы
- •18.4. Статические члены класса
- •18.5. Указатель this
- •18.6. Статические функции-члены
- •18.7. Указатели на члены класса
- •18.8. Инициализация данных–членов класса
- •18.9. Конструктор копирования и операция присваивания
- •18.10. Дружественные функции
- •18.11. Конструктор и операция new
- •18.12. Вызов деструктора
- •19. Производные классы
- •19.1. Построение производного класса
- •19.2. Защищенные члены класса
- •19.3. Управление уровнем доступа к членам класса
- •19.4. Последовательность вызова конструктора и деструктора при построении производного класса на основе одного базового
- •19.5. Преобразования типов
- •20. Полиморфизм
- •20.1. Раннее и позднее связывание
- •20.2. Виртуальные функции
- •20.3. Абстрактные классы
- •21. Переопределение стандартных операций
- •21.1. Основные определения и свойства
- •21.2. Операции new и delete при работе с абстрактными типами
- •21.3. Использование new при создании динамического объекта абстрактного типа
- •21.4. Операция delete
- •21.5. Преобразование типов
- •22. Некоторые особенности переопределенных операций
- •22.2. Операция [ ]
- •23. Классы и шаблоны
- •24. Списки
- •24.1. Операции над односвязными списками
- •24.2. Двунаправленные и кольцевые списки
- •24.3. Операции над кольцевыми списками
- •25. Стеки
- •25.1. Реализация стека через массив
- •25.2. Реализация стека через динамическую цепочку звеньев
- •26. Двоичные деревья
- •26.1. Определение и построение
- •26.2.Таблицы
- •27. Список литературы
18.5. Указатель this
Рассмотрим пример:
class str {
char * string;
public:
void set( char *text){string = text;}
void write () {
cout<<”Строка: ”<<string<<’\n’;}
};
void main(){
str str1, str2;
str1.set (“Привет!”);
str2.set (“Hello!”);
str1.write ();
str2.write ();
}
В результате выполнения этой программы на экране появится следующее:
Строка: Привет!
Строка: Hello!
Зададимся вопросом: как функция – член write узнает, для какого именно объекта она вызвана? Функция – член определяет, для какого объекта она вызвана потому, что ей в качестве неявного первого аргумента передается адрес этого объекта. В данном случае - указатель типа str*.
Внутри функции – члена класса можно явно использовать этот указатель. Он всегда имеет имя this (ключевое слово).
Перед началом выполнения кода функции указатель this инициализируется значением адреса объект, для которого вызвана данная функция-член. Таким образом, приведенное выше определение функции str::write() представляет собой сокращенную форму следующей записи:
void write(){
cout <<”Строка :”<<this ->string<<’\n’;
}
Отметим, что явное присваивание указателю this некоторого значения запрещено.
18.6. Статические функции-члены
Перед объявлением функции-члена класса можно поставить служебное слово static. Особенностью таких статических функций-членов является следующее: как и к статическому данному-члену класса, к ней можно обратиться еще до того, как в программе создан первый объект такого класса. Статические функции-члены (компонентные функции) позволяют получить доступ к частным статическим данным-членам класса, не имея еще ни одного объекта данного типа в программе.
Для статической компонентной функции не определен указатель this. Когда это необходимо, адрес объекта, для которого вызывается статическая функция-член, должен быть передан ей явно в виде аргумента.
Пример:
class prim{
int numb;
static stat;
public:
prim (int i) {
numb=i;
}
/* Далее - статическая функция. Указатель this не определен и выбор объекта осуществляется по явно переданному указателю.
Член stat не требует указателя на объект, .т.к. он общий для всех объектов класса prim.
*/
static void func (int i, prim *p = 0) {
if (p) p-> numb = i;
else stat = i;
}
static void show ( ){
/* Статическая функция обращается только к статическому члену класса, никаких указателей не требуется: */
cout<<”stat=”<<stat<<’\n’;
}
}; // Конец класса prim.
int prim::stat = 8; // Инициализация статического члена класса.
void main(){
/* До создания объектов типа prim возможен единственный способ обращения к статической функции-члену: */
ptim::show ();
// Можно изменить значение статического члена класса:
prim::func(10);
/* После создания объекта типа prim можно обратиться к статической функции обычным для абстрактных типов способом: */
prim obj(23); // obj.numb становится равным 23.
obj.show();
// Можно изменить значение созданного объекта:
prim::func(20, &obj); // obj.numb = = 20.
obj.func(27, &obj); // obj.numb = = 27.
}