Различия
Показаны различия между двумя версиями страницы.
— | opredelenie_klassa_i_sozdanie_ego_obekta [2025/07/06 12:39] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Определение класса в языке C++ и создание его объекта ====== | ||
+ | **Класс** - это производный структурированный тип, введенный программистом на основе уже существующих типов. Другими словами, | ||
+ | Общий синтаксис класса можно определить с помощью конструкции: | ||
+ | <file cpp> | ||
+ | class имя_класса { список_компонентов }; | ||
+ | </ | ||
+ | * имя_класса - произвольно выбираемый идентификатор | ||
+ | * список_компонентов - определения и описания типизированных данных и принадлежащих классу функций. Компонентами класса могут быть данные, | ||
+ | * Заключенный в фигурные скобки список компонентов называют телом класса. | ||
+ | * Телу класса предшествует заголовок. В простейшем случае заголовок класса включает слово class и имя. | ||
+ | * Определение класса всегда заканчивается точкой с запятой. | ||
+ | |||
+ | Итак, принадлежащие классу функции мы будем называть методами класса или компонентными функциями. Данные класса - компонентными данными или элементами данных класса. | ||
+ | |||
+ | Вернемся к определению: | ||
+ | <file cpp> | ||
+ | имя_класса имя_объекта; | ||
+ | </ | ||
+ | Определение объекта класса предусматривает выделение участка памяти и деление этого участка на фрагменты, | ||
+ | |||
+ | ====== Способы доступа к компонентам класса. ====== | ||
+ | Существует несколько уровней доступа к компонентам класса. Рассмотрим основные: | ||
+ | * **public** - члены класса открыты для доступа извне. | ||
+ | * **private** - члены класса закрыты для доступа извне. | ||
+ | По умолчанию все переменные и функции, | ||
+ | |||
+ | С использованием спецификатора доступа public можно создать открытый член класса, | ||
+ | |||
+ | <file cpp> | ||
+ | class имя_класса | ||
+ | { | ||
+ | | ||
+ | | ||
+ | public: | ||
+ | | ||
+ | | ||
+ | } список имен объектов; | ||
+ | </ | ||
+ | |||
+ | Синтаксис для доступа к данным конкретного объекта заданного класса (как и в случае структур), | ||
+ | < | ||
+ | имя_объекта.имя_члена класса; | ||
+ | </ | ||
+ | Пришло время примера... | ||
+ | <file cpp> | ||
+ | # include < | ||
+ | using namespace std; | ||
+ | class Test{ | ||
+ | // так как спецификатор доступа не указан | ||
+ | // данная переменная будет по умолчанию закрыта | ||
+ | // для доступа вне класса (private) | ||
+ | int one; | ||
+ | |||
+ | // спецификатор доступа public | ||
+ | // все члены, идущие после него | ||
+ | // будут открыты для доступа извне | ||
+ | public: | ||
+ | |||
+ | // инициализировать переменные в классе | ||
+ | // при создании запрещено, | ||
+ | // метод, реализующий данное действие | ||
+ | void Initial(int o,int t){ | ||
+ | one=o; | ||
+ | two=t; | ||
+ | } | ||
+ | |||
+ | // метод показывающий переменные класса | ||
+ | // на экран | ||
+ | void Show(){ | ||
+ | cout<<" | ||
+ | } | ||
+ | int two; | ||
+ | }; | ||
+ | void main(){ | ||
+ | |||
+ | // создается объект с типом Test | ||
+ | Test obj; | ||
+ | // вызывается функция, | ||
+ | obj.Initial(2, | ||
+ | |||
+ | // показ на экран | ||
+ | obj.Show(); | ||
+ | |||
+ | // прямая запись в открытую переменную two | ||
+ | // с переменной one такая запись невозможна, | ||
+ | // как доступ к ней закрыт | ||
+ | obj.two=45; | ||
+ | |||
+ | // снова показ на экран | ||
+ | obj.Show(); | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | Вышеописанный пример вполне интуитивно прост, однако, | ||
+ | ===== Оператор . ===== | ||
+ | Внутри класса функции-члены могут вызывать друг друга и обращаться к к переменным членам, | ||
+ | ===== Оператор -> ===== | ||
+ | [[Указатели на объекты]]. Доступ к членам объекта можно осуществлять и через указатель на объект. В этом случае применяется операция стрелка (->). | ||
+ | ===== Оператор :: ===== | ||
+ | Оператор :: называется // | ||
+ | <file cpp> | ||
+ | class stack { | ||
+ | |||
+ | int stck[SIZE]; | ||
+ | |||
+ | int tos; | ||
+ | |||
+ | public: | ||
+ | |||
+ | void init(); | ||
+ | |||
+ | void push(int i); | ||
+ | |||
+ | int pop(); | ||
+ | |||
+ | }; | ||
+ | |||
+ | |||
+ | |||
+ | void stack:: | ||
+ | |||
+ | { | ||
+ | |||
+ | tos = 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | void stack:: | ||
+ | |||
+ | { | ||
+ | |||
+ | if(tos==SIZE) { | ||
+ | |||
+ | cout << "Stack is full.\n"; | ||
+ | |||
+ | return; | ||
+ | |||
+ | } | ||
+ | |||
+ | stck[tos] = i; | ||
+ | |||
+ | tos++; | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | ====== Константный метод объекта ====== | ||
+ | Говорят, | ||
+ | |||
+ | [[zametki_po_jazyku_c|Язык С++]] позволяет пометить метод как константный. При этом неконстантные методы объекта запрещается использовать в теле помеченного метода, | ||
+ | |||
+ | <note important> | ||
+ | Давайте, | ||
+ | <file cpp> | ||
+ | # include < | ||
+ | # include < | ||
+ | using namespace std; | ||
+ | class Personal | ||
+ | { | ||
+ | public: | ||
+ | // конструктор с параметрами | ||
+ | // мы выделяем здесь память | ||
+ | // однако в нашем примере нет | ||
+ | // ни деструктора, | ||
+ | // копирования - единственная цель, | ||
+ | // которую мы преследуем показать | ||
+ | // работу константного метода | ||
+ | Personal(char*p, | ||
+ | name=new char[strlen(n)+1]; | ||
+ | if(!name){ | ||
+ | cout<<" | ||
+ | exit(0); | ||
+ | } | ||
+ | picture_data=new char[strlen(n)+1]; | ||
+ | if(!picture_data){ | ||
+ | cout<<" | ||
+ | exit(0); | ||
+ | } | ||
+ | strcpy(picture_data, | ||
+ | strcpy(name, | ||
+ | age=a; | ||
+ | } | ||
+ | |||
+ | // Группа константных методов | ||
+ | // внутри них невозможно | ||
+ | // изменить какое-то из свойств | ||
+ | const char*Name()const{ | ||
+ | return name; | ||
+ | } | ||
+ | int Age()const{ | ||
+ | return age; | ||
+ | } | ||
+ | const char*Picture()const{ | ||
+ | return picture_data; | ||
+ | } | ||
+ | |||
+ | void SetName(const char*n){ | ||
+ | strcpy(name, | ||
+ | } | ||
+ | void SetAge(int a){ | ||
+ | age=a; | ||
+ | } | ||
+ | void SetPicture(const char*p){ | ||
+ | strcpy(picture_data, | ||
+ | } | ||
+ | |||
+ | private: | ||
+ | char*picture_data; | ||
+ | char*name; // имя | ||
+ | int age; // возраст | ||
+ | }; | ||
+ | |||
+ | void main(){ | ||
+ | Personal A(" | ||
+ | cout<<" | ||
+ | cout<<" | ||
+ | cout<<" | ||
+ | A.SetPicture(" | ||
+ | A.SetName(" | ||
+ | A.SetAge(90); | ||
+ | cout<<" | ||
+ | cout<<" | ||
+ | cout<<" | ||
+ | } | ||
+ | </ | ||
+ | В данном примере методы Name, Age, Picture объявлены константными. Кроме того, можно наблюдать и использование константных указателей: |
📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.
📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Nginx простые примеры конфигурации
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах
7 Самых Популярных Обзоров
- Хостинг для Python-скриптов и приложений
- ТОП 4 лучших антидетект браузеров (Бесплатные & Платные)
- Подборка купонов (промокоды) на хостинг, антидетект браузеры
- Обзор THE.Hosting (PQ Hosting): надежный хостинг с профессиональной поддержкой
- Хостинг в России
- Хостинг в Европе
- Обзор браузера Dolphin {anty} для мультиаккаунтинга