
- •1)Классы, объявление классов, спецификаторы доступа.
- •2)Классы, поля классов, инкапсуляция.
- •3)Методы и их реализация на примере класса «Комплексное число».
- •4)Создание объектов. Объекты и методы.
- •5)Конструкторы, виды конструкторов.
- •6) Конструктор по умолчанию, конструктор с параметрами.
- •7)Конструктор преобразования, конструктор копии.
- •8) Деструкторы
- •9)Перегрузка операций.
- •10) Стековые и динамические объекты, указатели и ссылки, достоинства и недостатки стековых объектов.
- •Размещение в стеке
- •Динамическое размещение
- •Указатели и ссылки
- •Недостатки стековых объектов
- •Достоинства стековых объектов
- •11) Указатели, арифметика указателей.
- •12)Указатель на константу, константный указатель, константный указатель на константу, константные аргументы функций, константные функции классов.
- •Константные переменные
- •Константы в перечислениях
- •Указатель на константу
- •Константный указатель
- •Константный указатель на константу
- •Константные аргументы функций
- •Неконстантные аргументы функций
- •Константные функции классов
- •13)Механизмы передачи параметров в функции, аргументы по умолчанию, указатель на функцию.
- •14)Дружественные функции (методы).
- •15)Статические поля и методы.
- •16) Инкапсуляция, ее реализация через понятие class.
1)Классы, объявление классов, спецификаторы доступа.
Класс является абстрактным типом данных, определяемым пользователем,
и представляет собой модель реального объекта в виде данных и функций для
работы с ними.
Данные класса называются полями (по аналогии с полями структуры), а функции
класса — методами. Поля и методы называются элементами класса. Описание(объявление)
класса в первом приближении выглядит так:
class <имя>{
[ private: ]
<описание скрытых элементов>
public:
<описание доступных элементов>
} ; / / Описание заканчивается точкой с запятой
Классы могут быть определены через механизм наследования, для улучшения повторного использования кода и удобства разработки библиотек. Классы могут быть глобальными (объявленными вне любого блока) и локальными (объявленными внутри блока, например, функции или другого класса).
Возможность скрывать внутренние детали при описании общего интерфейса для типа, определенного пользователем, называется инкапсуляцией. В С++ она реализована через объявления class и struct в соединении с ключевыми словами private (закрытый), protected (защищенный) и public (открытый), определяющими уровень доступа.
Т.е. спецификаторы доступа private и рubliс управляют видимостью элементов класса.
Элементы, описанные после служебного слова private, видимы только внутри
класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса опи-
cывается после спецификатора public. Действие любого спецификатора распространяется
до следующего спецификатора или до конца класса. Можно задавать
несколько секций private и public, порядок их следования значения не имеет.
2)Классы, поля классов, инкапсуляция.
Возможность скрывать внутренние детали при описании общего интерфейса для типа, определенного пользователем, называется инкапсуляцией. В С++ она реализована через объявления class и struct в соединении с ключевыми словами private (закрытый), protected (защищенный) и public (открытый), определяющими уровень доступа. Сам класс определяется как список своих членов, а именно полей (свойств) и методов/функций/процедур. Классы могут задавать поля — то есть переменные, принадлежащие либо непосредственно самому классу (статические), либо экземплярам класса (обычные)
Поля класса:
• могут иметь любой тип, кроме типа этого же класса (но могут быть указателями
или ссылками на этот класс);
• могут быть описаны с модификатором const, при этом они инициализируются
только один раз (с помощью конструктора) и не могут изменяться;
• могут быть описаны с модификатором static, но не как auto, extern и register.
Инициализация полей при описании не допускается.
3)Методы и их реализация на примере класса «Комплексное число».
В терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, для того чтобы подчеркнуть, что конкретная функция является членом некоторого класса.
Предположим, в программе необходимо оперировать комплексными числами. Комплексные числа состоят из вещественной и мнимой частей, и с ними можно выполнять арифметические операции.
class Complex {
public:
int real; // вещественная часть
int imaginary; // мнимая часть
void Add(Complex x);
// прибавить комплексное число
};
Приведенный выше пример - упрощенное определение класса Complex, представляющее комплексное число. Для класса Complex определен метод - Add.
Определение методов класса
void
Complex::Add(Complex x)
{
this->real = this->real + x.real;
this->imaginary = this->imaginary +
x.imaginary;
}
Первые две строки говорят о том, что это метод Add класса Complex. В фигурных скобках записано определение операции или метода Add. Это определение означает следующее: для того чтобы прибавить значение объекта класса Complex к данному объекту, надо сложить вещественные части и запомнить результат в атрибуте вещественной части текущего объекта. Точно так же следует сложить мнимые части двух комплексных чисел и запомнить результат в атрибуте текущего объекта, обозначающем мнимую часть.
Запись this-> говорит о том, что атрибут принадлежит к тому объекту, который выполняет метод Add ( объекту, получившему сообщение Add ). В большинстве случаев this-> можно опустить. В записи определения метода какого-либо класса упоминание атрибута класса без всякой дополнительной информации означает, что речь идет об атрибуте текущего объекта.
Теперь приведем этот небольшой пример полностью:
// определение класса комплексных чисел
class Complex {
public:
int real; // вещественная часть
int imaginary; // мнимая часть
void Add(Complex x);
// прибавить комплексное число
};
// определение метода сложения
void
Complex::Add(Complex x)
{
real = real + x.real;
imaginary = imaginary + x.imaginary;
}
int
main()
{
Complex number;
number.real = 1;
// первый объект класса Complex
number.imaginary = 3;
Complex num2;
// второй объект класса Complex
num2.real = 2;
num2.imaginary = 1;
number.Add(num2);
// прибавить значение второго
// объекта к первому
return 1;
}