- •Лекция: шаблоны функций
- •Унарные операции получения адреса ссылки
- •Взаимосвязь между указателями и массивами
- •Указатели на указатели
- •Конструктор и деструктор класса
- •Структуры
- •Доступ к элементам структуры
- •Область действия класса
- •Поразрядные операции
- •Присваивание побитовым копированием по умолчанию.
- •Дружественные классы.
- •Потоки ввода и вывода
- •Форматирование данных
Унарные операции получения адреса ссылки
Унарная операция применима к величинам имеющим имя и размещённым в озу. ТО нельзя получить адрес скалярного выражения не именованной const.
Взаимосвязь между указателями и массивами
Массивы и указатели взаимосвязаны и почти эквивалентны друг другу. Имя указателя можно понимать как константный указатель. Его можно использовать для выполнения любой операции, включая индексирование массива. Нотация – описание какого-либо слов, элемента.
Используйте нотацию массивов, а не нотацию указателей при манипуляции массивами. Прога будет длиннее, но более понятна.
int b[5];
bPtr=b
это эквивалентно присваиванию адреса первого эл массива след образом:
bPtr=&b[0];
Ссылаться на эл массива b[3]: *(bPtr+3), где 3 смещение.
Когда указатель указывает на начало массива, смещение указ на какой эл массива должна быть ссылка, так что значение смещения эквивалентно индексу массива.
Предыдущую запись называют запись указатель-смещение. Приоритет * выше, чем у «+». Так как эл массива мб указан указателем выражение «&b[3]» может быть записано по-другому bPtr+3
Сам массив можно рассматривать как указатель и исп в арифметике указателей *(b+3) тоже ссылается на эл массива b[3]. Все выражения с индексами массива могут быть записаны с помощью указателей и смещения. В этом случаи запись указатель смещение применялась бы к имени массива как к указателю. Важно что *(b+3) не модифицирует имя массива; b – первый эл массива.
Указатели можно индексировать также как и массив. bPtr[1]=b[1]. Это выражение как запись-указатель-индекс. b+=3 разрешено, так как оно пытается модифицировать значение имени массива с помощью арифметических операций. Имена массивов модифицировать нельзя.
Найти определитель 3–х мерной матрицы.
Указатели на указатели
*ptr |
*ptr |
*ptr |
Строка 1 |
Строка 2 |
Строка 3 |
*Ptr Содержит адрес массива указателя.
Char**pp(Содержит адрес массиве указателей на строки) размер массива int size=0. Нам необходимо написать ф-цию, которая будет выделять динамическую память для новых элементов массива указателей и для хранения символов новых строк. Эта ф-ция будет принимать как параметры указатель на указатель, размер массива указателя и строку, которую надо будет записать в выделенную под неё память. В строке 6 **AddPtr объявляем прототип функции. Перед название ф-ции ставим**, так как ф-ция будет возвращать указатель на указатель. В главной ф-ции создаём указатель на указатель типа Char **pp, который изначально не на что не указывает и счётчик элементов массивов указателей size. Далее идёт поочерёдное наращивание массива указателей и добавления в него данных посредством ф-ции AddPtr. При этом каждый раз после вызова ф-ции мы увелич сайз на 1. В виде параметра ф-ции AddPtr будет принимать объявленный указатель на указатель иопр нами строку. При первом вызове ф-ции придаётся значение 0, срабатывает if, в котором мы выделяем динамическую память для 1 эл массива указателей pp=new char *[size+1]. ВСЁ, ЧТО МЫ ПИШЕМ, ОПИСАНО В КОМЕНТАРИЯХ ПРОГРАММЫ «YKAZATELINAYKAZATELY», ПОЭТОМУ Я НЕ БУДУ ПИСАТЬ ЭТУ Х&&НЮ!!!
|
Классы в с++
Классы в программировании состоят из свойств и методов. Свойства — это любые данные, которыми можно характеризовать объект класса. В нашем случае, объектом класса является студент, а его свойствами — имя, фамилия, оценки и средний балл.
Методы — это функции, которые могут выполнять какие-либо действия над данными (свойствами) класса. Добавим в наш класс функцию calculate_average_ball(), которая будет определять средний балл успеваемости ученика.
Модификаторы доступа public и private
Все свойства и методы классов имеют права доступа. По умолчанию, все содержимое класса является доступным для чтения и записи только для него самого. Для того, чтобы разрешить доступ к данным класса извне, используют модификатор доступа public. Все функции и переменные, которые находятся после модификатора public, становятся доступными из всех частей программы.
Закрытые данные класса размещаются после модификатора доступа private. Если отсутствует модификатор public, то все функции и переменные, по умолчанию являются закрытыми (как в первом примере).
Обычно, приватными делают все свойства класса, а публичными — его методы. Все действия с закрытыми свойствами класса реализуются через его методы. Рассмотрим следующий код.
class Students {
public:
// Установка среднего балла
void set_average_ball(float ball)
{
average_ball = ball;
}
// Получение среднего балла
float get_average_ball()
{
return average_ball;
}
std::string name;
std::string last_name;
int scores[5];
private:
float average_ball;
};
Мы не можем напрямую обращаться к закрытым данными класса. Работать с этими данными можно только посредством методов этого класса. В примере выше, мы используем функцию get_average_ball() для получения средней оценки студента, и set_average_ball() для выставления этой оценки.
Функция set_average_ball() принимает средний балл в качестве параметра и присваивает его значение закрытой переменной average_ball. Функция get_average_ball() просто возвращает значение этой переменной.