Что такое объект класса
Перейти к содержимому

Что такое объект класса

  • автор:

Чем отличается экземпляр класса от объекта класса?

Чем отличается экземпляр класса от объекта класса в objective-c? Задали такой вопрос на собеседовании, я в недоумении ответил «Не понимаю вопроса, разве это не одно и то же?». Просьба сильно не пинать, обж-си учил сам, в ускоренном темпе, и времени разбираться с самой концепцией не было.

Отслеживать
4,508 22 22 серебряных знака 29 29 бронзовых знаков
задан 30 янв 2011 в 11:31
AlexDenisov AlexDenisov
6,442 1 1 золотой знак 21 21 серебряный знак 29 29 бронзовых знаков

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

Я думаю, Вы попали под раздачу из-за недостаточной квалификации собеседующего… если заниматься прямым переводом терминов, то можно много интересного узнать :).

В документации по Obj-C используются термины class object и class instance . Если их дословно перевести на русский, то получится как раз то, о чём Вас спрашивали. Причём в русском языке естественно объект класса считать его экземпляром . В то время, как совершено очевидно, что означает английский термин class object — этот объект, в котором хранится, так сказать, информация о классе.

Class Objects

  • The name of the class and its superclass
  • A template describing a set of instance variables
  • The declarations of method names and their return and argument types
  • The method implementations

Понятие класса, экземпляра класса и объекта в ООП.

Независимо от того, какой язык программирования вы собираетесь изучать: PHP, Javascript или др. языки программирования, при изучении объектно-ориентированного подхода к программированию, обязательно нужно разобраться с понятиями класса и объекта.

Из предыдущего видео мы знаем, что самым главным действующим лицом в объектно-ориентированном подходе программирования является объект, у которого есть какие-то свойства (т.е. характеристики этого объекта), значения этих свойств и методы, те действия, которые этот объект может совершать.

Но, для того, чтобы в нашей программе появился объект, нужно совершить два действия:

1) Его нужно описать. Какие свойства и методы есть у этого объекта.

2) Его нужно создать

Что значит описать объект? Описание объекта – это определение его свойств и методов, которые этот объект может принимать. Т.е. мы начинаем создавать программу и пишем, что у нас будет некий объект (например, Employee или Работник).

У этого объекта будет свойства first_name (имя), last_name (фамилия), age (возраст).

Этот объект при запросе к нему может выдавать его имя (getFirstName()), фамилию getLastName()), возраст (getAge()).

Обратите внимание, что в конце метода ставятся круглые скобки (). Они обозначают то, что это является методом. Остальное является свойствами, характеристиками объекта.

Что же значит создать объект?

Создание объекта – это некий процесс обращения к конкретному экземпляру описанного объекта. После описания объекта он имеет некую абстрактную форму и когда мы обращаемся к какому-то конкретному работнику, к какому-то конкретному экземпляру этого описания: работник 1, работник 2, работник 3. У нас может быть множество работников, которые соответствуют этой схеме.

Когда мы с вами обращаемся к какому-то конкретному экземпляру этой сущности работника, то мы создаем некий объект, т.е. некий экземпляр существующего описания этого объекта.

Тот программный код, который содержит описательную часть объекта, он называется класс. Часть, в которой мы описываем объект – это называется классом. Т.е. класс – это некая сущность, которая описываем, что будут собой представлять все те экземпляры, которые будут создаваться из этого класса.

Экземпляры классов = объекты.

Объект – это просто что-то конкретное, а класс – это некое абстрактное понятие, которое просто содержит описательную часть.

Класс – это что-то вроде чертежа объекта, т.е. прежде чем мы создадим какую-то деталь, проектировщик должен сделать ее чертеж. Написать, что у этой детали будут такие-то свойства (высота, ширина, длина). Когда чертеж будет выполнен, мы отдаем его какому-то мастеру, и он уже создает экземпляры из этого класса. Деталей, которые могут быть созданы из этого чертежа огромное количество.

Также и в программировании: класс у нас один, а экземпляров этого класса, объектов может быть огромное количество.

И нужно понимать, что

Чертеж НЕ равно деталь

Класс НЕ равно объект

Общий алгоритм работы с объектно-ориентированным подходом в программировании:

  1. Создали класс
  2. Создали экземпляр класса (объект)
  3. Обращаемся к свойствам и методам экземпляра класса.

Конечно, сейчас многое может быть с этим не понятно, но здесь важно приступить к практике и посмотреть на конкретных примерах, как это работает.

Урок №113. Классы, Объекты и Методы

Хотя язык C++ предоставляет ряд фундаментальных типов данных (например, char, int, long, float, double и т.д.), которых бывает достаточно для решения относительно простых проблем, для решения сложных проблем функционала этих простых типов может не хватать.

Оглавление:

  1. Классы
  2. Методы классов
  3. Примечание о структурах в C++
  4. Заключение
  5. Тест

Классы

Одной из наиболее полезных особенностей языка C++ является возможность определять собственные типы данных, которые будут лучше соответствовать в решении конкретных проблем. Вы уже видели, как перечисления и структуры могут использоваться для создания собственных пользовательских типов данных. Например, структура для хранения даты:

struct DateStruct

Перечисления и структуры — это традиционный (не объектно-ориентированный) мир программирования, в котором мы можем только хранить данные. В C++11 мы можем создать и инициализировать структуру следующим образом:

DateStruct today < 12 , 11 , 2018 >; // используем uniform-инициализацию

Для вывода даты на экран (что может понадобиться выполнить и не раз, и не два) хорошей идеей будет написать отдельную функцию, например:

struct DateStruct
void print ( DateStruct &date )
std :: cout << date . day << "/" << date . month << "/" << date . year ; DateStruct today < 12 , 11 , 2018 >; // используем uniform-инициализацию
today . day = 18 ; // используем оператор выбора члена для выбора члена структуры
print ( today ) ;

Результат выполнения программы:

В объектно-ориентированном программировании типы данных могут содержать не только данные, но и функции, которые будут работать с этими данными. Для определения такого типа данных в языке C++ используется ключевое слово class. Использование ключевого слова class определяет новый пользовательский тип данныхкласс.

В языке C++ классы очень похожи на структуры, за исключением того, что они обеспечивают гораздо большую мощность и гибкость. Фактически, следующая структура и класс идентичны по функционалу:

struct DateStruct
class DateClass
int m_month ;
int m_year ;

Единственным существенным отличием здесь является public — ключевое слово в классе (о нем мы поговорим детально на соответствующем уроке).

Так же, как и объявление структуры, объявление класса не приводит к выделению какой-либо памяти. Для использования класса нужно объявить переменную этого типа класса:

DateClass today < 12 , 11 , 2018 >; // инициализируем переменную класса DateClass

В языке C++ переменная класса называется экземпляром (или «объектом») класса. Точно так же, как определение переменной фундаментального типа данных (например, int x ) приводит к выделению памяти для этой переменной, так же и создание объекта класса (например, DateClass today ) приводит к выделению памяти для этого объекта.

Методы классов

Помимо хранения данных, классы могут содержать и функции! Функции, определенные внутри класса, называются методами. Методы могут быть определены, как внутри, так и вне класса. Пока что мы будем определять их внутри класса (для простоты), как определить их вне класса — рассмотрим несколько позже.

Класс Date с методом вывода даты:

class DateClass
int m_month ;
int m_year ;
void print ( ) // определяем функцию-член
std :: cout << m_day << "/" << m_month << "/" << m_year ;

Точно так же, как к членам структуры, так и к членам (переменным и функциям) класса доступ осуществляется через оператор выбора членов ( . ):

class DateClass
int m_month ;
int m_year ;
void print ( )
std :: cout << m_day << "/" << m_month << "/" << m_year ; DateClass today < 12 , 11 , 2018 >;

today . m_day = 18 ; // используем оператор выбора членов для выбора переменной-члена m_day объекта today класса DateClass

today . print ( ) ; // используем оператор выбора членов для вызова метода print() объекта today класса DateClass

Результат выполнения программы:

Обратите внимание, как эта программа похожа на вышеприведенную программу, где используется структура. Однако есть несколько отличий. В версии DateStruct нам нужно было передать переменную структуры непосредственно в функцию print() в качестве параметра. Если бы мы этого не сделали, то функция print() не знала бы, какую переменную структуры DateStruct выводить. Нам тогда бы пришлось явно ссылаться на члены структуры внутри функции.

Методы класса работают несколько иначе: все вызовы методов должны быть связаны с объектом класса. Когда мы вызываем today.print() , то мы сообщаем компилятору вызвать метод print() объекта today .

Рассмотрим определение метода print() еще раз:

void print ( ) // определяем метод
std :: cout << m_day << "/" << m_month << "/" << m_year ;

На что фактически ссылаются m_day , m_month и m_year ? Они ссылаются на связанный объект today (который определен caller-ом).

Поэтому, при вызове today.print() , компилятор интерпретирует:

m_day , как today.m_day ;

m_month , как today.m_month ;

m_year , как today.m_year .

Если бы мы вызвали tomorrow.print() , то m_day ссылался бы на tomorrow.m_day .

По сути, связанный объект неявно передается методу. По этой причине его часто называют неявным объектом.

Детально о том, как передается неявный объект методу, мы поговорим на соответствующем уроке. Ключевым моментом здесь является то, что для работы с функциями, не являющимися членами класса, нам нужно передавать данные в эту функцию явно (в качестве параметров). А для работы с методами у нас всегда есть неявный объект класса!

Использование префикса m_ (англ. «m» = «members») для переменных-членов помогает различать переменные-члены от параметров функции или локальных переменных внутри методов класса. Это полезно по нескольким причинам:

во-первых, когда мы видим переменную с префиксом m_ , то мы понимаем, что работаем с переменной-членом класса;

во-вторых, в отличие от параметров функции или локальных переменных, объявленных внутри функции, переменные-члены объявляются в определении класса. Следовательно, если мы хотим знать, как объявлена ​​переменная с префиксом m_ , мы понимаем, что искать нужно в определении класса, а не внутри функции.

Обычно программисты пишут имена классов с заглавной буквы.

Правило: Пишите имена классов с заглавной буквы.

Вот еще один пример программы с использованием класса:

class Employee
std :: string m_name ;
double m_wage ;
// Метод вывода информации о работнике на экран
void print ( )
std :: cout << "Name: " << m_name << "\nId: " << m_id << "\nWage: $" << m_wage << '\n' ; // Определяем двух работников Employee john < "John" , 5 , 30.00 >;
Employee max < "Max" , 6 , 32.75 >;
// Выводим информацию о работниках на экран
john . print ( ) ;
std :: cout << std :: endl ; max . print ( ) ;

Результат выполнения программы:

Name: John
Id: 5
Wage: $30

Name: Max
Id: 6
Wage: $32.75

В отличие от обычных функций, порядок, в котором определены методы класса, не имеет значения!

Примечание о структурах в C++

В языке Cи структуры могут только хранить данные и не могут иметь связанных методов. После проектирования классов (используя ключевое слово class) в языке С++, Бьёрн Страуструп размышлял о том, нужно ли, чтобы структуры (которые были унаследованы из языка Си) имели связанные методы. После некоторых размышлений он решил, что нужно. Поэтому в программах, приведенных выше, мы также можем использовать ключевое слово struct, вместо class, и всё будет работать!

Многие разработчики (включая и меня) считают, что это было неправильное решение, поскольку оно может привести к проблемам, например, справедливо предположить, что класс выполнит очистку памяти после себя (например, класс, которому выделена память, освободит её непосредственно перед моментом уничтожения самого класса), но предполагать то же самое при работе со структурами — небезопасно. Следовательно, рекомендуется использовать ключевое слово struct для структур, используемых только для хранения данных, и ключевое слово class для определения объектов, которые требуют объединения как данных, так и функций.

Правило: Используйте ключевое слово struct для структур, используемых только для хранения данных. Используйте ключевое слово class для объектов, объединяющих как данные, так и функции.

Заключение

Оказывается, Стандартная библиотека C++ полна классов, созданных для нашего удобства. std::string, std::vector и std::array — это всё типы классов! Поэтому, когда вы создаете объект любого из этих типов, вы создаете объект класса. А когда вы вызываете функцию с использованием этих объектов, вы вызываете метод:

Что такое объекты и классы: 1‑я часть гайда по ООП

Почти всё современное программирование построено на принципах ООП, поэтому их должен понимать каждый разработчик. Узнайте основы из этой статьи.

Фото: Sonja Flemming / NBCUniversal / Getty Images

Евгений Кучерявый

Евгений Кучерявый

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.

Это первая статья из серии, посвящённой объектно-ориентированному программированию. Она предназначена для тех, кто хочет понять суть этой парадигмы разработки, а не просто научиться использовать классы и объекты.

Цикл состоит из статей, посвящённых различным аспектам ООП:

  • что такое классы и объекты;
  • особенности работы с объектами;
  • модификаторы доступа, инкапсуляция;
  • перегрузка методов;
  • полиморфизм;
  • наследование и ещё немного полиморфизма;
  • абстрактные классы и интерфейсы;
  • практикум.

Все примеры в этой серии написаны на языке C#. Для наглядности они будут связаны с разработкой игр, потому что именно в играх (хотя далеко не только в них) активно используются объекты.

Перед тем как приступать к изучению ООП, убедитесь, что знакомы со следующими понятиями:

  • переменные и типы данных,
  • условные конструкции,
  • циклы,
  • коллекции (желательно).

Работа будет проходить в Visual Studio 2019, но вполне подойдёт и VS 2017.

В конце каждой статьи будут задания, которые помогут закрепить тему. Выполнять их необязательно, но имейте в виду, что осилить ООП без практики просто невозможно. Если же вам лень выполнять задания, можете просто посмотреть наш вариант решения. Итак, поехали!

Введение в объектно-ориентированное программирование:

  • Что такое ООП
  • Какие у него плюсы и минусы
  • Что такое абстракция, инкапсуляция, наследование и полиморфизм
  • Объекты и классы: как их использовать
  • Как создать класс
  • Как использовать поля и свойства класса
  • Как создать метод
  • Что такое конструктор объекта
  • Домашнее задание
  • Что запомнить

Что такое ООП

Объектно-ориентированное программирование (сокращённо ООП) — это парадигма разработки программного обеспечения, согласно которой приложения состоят из объектов.

На объектах и классах строится всё ООП. Поэтому давайте чётко обозначим, чем они отличаются друг от друга.

Класс — это тип данных, созданный пользователем. Он содержит разные свойства и методы, как, например, тип String или Int.

Объект — это экземпляр класса, или его копия, которая находится в памяти компьютера. Например, когда вы создаёте переменную типа String и присваиваете ей значение «Строка», то в памяти создаётся экземпляр класса String.

По-другому можно сказать, что объекты — это сущности, у которых есть свойства и поведение. Обычно объекты являются экземплярами какого-нибудь класса. Например, в игре может быть класс Character («Персонаж»), а его экземплярами будут hero или npc.

Свойства — это данные, которые связаны с конкретным объектом:

  • здоровье,
  • очки,
  • деньги,
  • сила,
  • ловкость,
  • интеллект,
  • скорость,
  • координаты.

Поведение объекта определяется с помощью методов — специальных блоков кода, которые можно вызывать из разных частей программы. Например, у того же объекта Character могут быть следующие методы:

  • идти,
  • атаковать,
  • говорить,
  • подобрать,
  • выбросить,
  • использовать.

Используя эти свойства и методы, можно значительно ускорить разработку, сделать код более читаемым. К тому же самому программисту проще составлять код, если он думает с помощью объектов.

Разработчики не пишут какую-то функцию, которая будет делать что-то для программы в целом. Вместо этого они мысленно разделяют приложение на отдельные компоненты и продумывают их свойства и поведение.

Такую парадигму используют многие популярные языки:

  • C#,
  • Java,
  • Python,
  • JavaScript,
  • PHP,
  • Kotlin,
  • Swift,
  • Objective-C,
  • C++.

У нас также есть статья по ООП на Python. Поэтому если вы не любите C#, то можете изучить главные принципы на Python.

Плюсы и минусы объектно-ориентированного программирования

Плюсы Минусы
Легко читается.
Не нужно выискивать в коде функции и выяснять, за что они отвечают
Потребляет больше памяти.
Объекты потребляют больше оперативной памяти, чем примитивные типы данных
Быстро пишется.
Можно быстро создать сущности, с которыми должна работать программа
Снижает производительность.
Многие вещи технически реализованы иначе, поэтому они используют больше ресурсов
Проще реализовать большой набор функций.
Так как на написание кода уходит меньше времени, можно гораздо быстрее создать приложение с множеством возможностей
Сложно начать.
Парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени
Меньше повторений.
Не нужно писать однотипные функции для разных сущностей

Основные принципы объектно-ориентированного программирования

Всё объектно-ориентированное программирование строится на четырёх понятиях:

Чтобы стало понятнее, представим, что у нас есть класс «Кошка». В нём присутствуют несколько атрибутов — например, «окрас», «порода» и «возраст», а также методов — например, «спать». И когда у нас есть класс, мы можем создать сколько угодно его экземпляров с разными свойствами. Например, мы можем добавить несколько пород кошек:

Теперь перейдём к принципам ООП.

Абстракция

При создании класса мы упрощаем его до тех атрибутов и методов, которые нужны в этом конкретном коде, не пытаясь описать его целиком и отбрасывая всё второстепенное. Скажем, все кошки теоретически умеют охотиться, но если наша программа не предназначена для ловли мышей, то и прописывать этот метод незачем.

Подробно об абстракции и абстрактных классах в ООП можно прочитать в другой нашей статье.

Инкапсуляция

Доступ к данным объекта должен контролироваться, чтобы пользователь не мог изменить их в произвольном порядке и что-то поломать. Поэтому для работы с данными программисты пишут публичные методы, которые составляют интерфейс объекта.

Возвращаясь к нашим кошечкам. Мы можем разрешить изменять атрибут «возраст», но только в большую сторону (к сожалению, с годами никто не молодеет), а атрибут «порода» лучше открыть только для чтения — ведь порода кошки не меняется.

Подробно об инкапсуляции с примерами кода читайте в гайде Skillbox Media.

Наследование

Классы могут передавать свои атрибуты и методы классам-потомкам. Например, мы хотим создать новый класс «Домашняя кошка». Он практически идентичен классу «Кошка», но у него появляются новые атрибуты — «хозяин» и «кличка», а также метод «клянчить вкусняшку». Достаточно объявить «Домашнюю кошку» наследником «Кошки» и прописать новые атрибуты и методы — вся остальная функциональность перейдёт от родителя к потомку.

Больше о наследовании, с примерами кода и полезными практическими советами, читайте в статье «Наследование и ещё немного полиморфизма: 6-я часть гайда по ООП».

Полиморфизм

Этот принцип позволяет применять одни и те же команды к объектам разных классов, даже если они выполняются по-разному. Например, помимо класса «Кошка», у нас есть никак не связанный с ним класс «Попугай» — и у обоих есть метод «спать». Несмотря на то, что кошки и попугаи спят по-разному (кошка сворачивается клубком, а попугай сидит на жёрдочке), для этих действий можно использовать одну команду.

Объекты и классы: как их использовать

Классами в C# является практически всё — строки, числа, массивы и так далее. У каждого из них есть свой набор свойств (например, количество символов в строке или размер типа данных), а также методы, которые позволяют удобно работать с объектами класса (например, отсортировать массив или сложить два числа).

На основе «базовых» классов из C#, мы можем создавать свои. К примеру, возьмём числа типа Int64 и создадим с помощью них числа с плавающей точкой. Такой класс, конечно, уже есть, но мы можем переопределить его по-своему.

Изучая C#, разработчик в первый же день сталкивается с классами и объектами. Например, вот как выглядит первая программа любого новичка:

Как создать класс

Чтобы создать класс, откройте в Visual Studio меню Project и выберите пункт Add Class…:

Затем введите его название и нажмите Add:

Программа создаст отдельный файл с таким кодом:

Если доступ к полям открыт, то с ними можно проводить вычисления или просто получать их значения. Если же нужно запретить доступ к определённым полям — используйте свойства.

Это специальные конструкции, которые позволяют обращаться к полям. Чтобы создать свойства, нужно сначала закрыть доступ к полям с помощью уровня доступа private — тогда они будут доступны только изнутри класса:

Как создать метод

Теперь можно приступить к работе с поведением объектов. Оно реализуется с помощью методов — специальных блоков кода, которые позволяют избежать повторений в проекте.

Методы являются аналогами функций (возвращают значение) и процедур (не возвращают), но с той разницей, что они являются частью какого-то класса. Например, можно в классе Character создать метод Move(), который будет отвечать за движение персонажа.

Если же нужно, чтобы метод что-то возвращал, то указывается его тип и используется оператор return:

Конструктор объекта

В примере выше объект создаётся с уже заданными значениями, но есть возможность указывать свои параметры. Для этого используются конструкторы — специальные методы, которые запускаются при инстанцировании экземпляра класса. С их помощью можно передать объекту параметры и провести необходимые операции.

Вот пример того же класса с конструктором:

Домашнее задание

Создайте консольную игру, в которой игрок сможет управлять персонажем с помощью команд. Возможности, которые должны быть в игре:

  • перемещение;
  • атака;
  • получение опыта за победу над врагами;
  • повышение уровня и здоровья персонажа.

Что запомнить

Это лишь вступление в ООП, и ещё многое предстоит изучить, чтобы начать применять его в полную силу. Например, нужно понять, как технически работают классы, как они хранятся в памяти, почему их называют ссылочными типами и так далее.

ООП — сложная, но эффективная парадигма программирования. Её стоит знать всем, кто хочет создавать программы и найти работу, потому что почти все популярные языки её поддерживают. И несмотря на то, что некоторые разработчики утверждают, будто «ООП умерло», потребность в программистах, которые владеют этим подходом, продолжает расти.

Больше интересного про код в нашем телеграм-канале. Подписывайтесь!

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *