Как сделать метод в c

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Методы описываются внутри класса, в следующем формате:

Рассмотрим более подробно запись, приведенную выше. С модификаторами доступа мы познакомились ранее, ровно как и с типами данных. К примеру, если метод должен быть доступен для вызова извне, и возвращает значение строкового типа, мы получим подобную запись:

Если же не предполагается возвращать результат работы метода, используется слово void. Параметры для методов так же указываются опционально. То есть их может и не быть совсем, как в нашем SomeMethod. Описываются параметры следующим образом: . Если бы в нашем методе были параметры, это выглядело бы примерно так.

Как вы могли заметить, третий параметр несколько отличается от первых двух — для него указано значение по умолчанию. Таким образом, мы можем вызывать SomeMethod, не указывая значение для третьего параметра. Также следует обратить внимание на правила именования методов и параметров. Microsoft рекомендуют использовать CamelCase при именовании методов (каждое слово с большой буквы) и pascalCase для переменных (первое слово с маленькой буквы, каждое последующее — с большой). И, разумеется, имена должны быть осмысленными и нести смысловую нагрузку. Комментарии, конечно, никто не отменял, но читать код с нормально именованными методами и переменными значительно приятнее и проще. Для методов, которые должны возвращать значение, необходимо указывать ключевое слово return. После этого слова должна идти переменная, значение которой возвращает метод. Например.

Перегрузка методов

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

Оба метода называются pow, однако первый вернет нам квадрат числа, а второй вернет число в степени power. Соответственно подобное написание и будет считаться перегрузкой метода. Если же мы попытаемся создать два метода с абсолютно идентичным набором параметров, типы данных и количество которых совпадают, IDE оповестит нас об ошибке. Так же существует более явная перегрузка методов при помощи ключевого слова override, однако об этом мы поговорим позднее.

Конструктор

Любой класс обладает некоторым набором свойств. А как корректно эти свойства установить при создании объекта класса? В данном случае на помощь приходит специальный метод — конструктор. Описывается он так:

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

Статичность

А если нам нужно вызвать метод класса не создавая для этого отдельный объект? В данном случае достаточно прописать этому методу ключевое слово static.

Таким образом, мы сможем совершенно спокойно работать с данным методом не создавая объект класса. Для вызова используется конструкция.

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

Рекурсивный вызов методов

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

Деструктор

Что произойдет с памятью, после того как объект класса отработает? По сути, она должна быть очищена. Так обычно и происходит. Однако, чтобы быть на сто процентов уверенными, мы можем создать метод-деструктор. Чтобы использовать ручной сбор мусора класс обязан реализовать интерфейс IDisposable. Интерфейсы мы рассмотрим несколько позднее.

Пример

Вернемся к нашему персонажу.

Персонаж с полосой hp

Рассмотрим код, который наделяет нашего персонажа набором методов для движения и выживания.

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

Весь реальный мир состоит из объектов. Города состоят из районов, в каждом районе есть свои названия улиц, на каждой улице находятся жилые дома, которые также состоят из объектов.

Практически любой материальный предмет можно представить в виде совокупности объектов, из которых он состоит. Допустим, что нам нужно написать программу для учета успеваемости студентов. Можно представить группу студентов, как класс языка C++. Назовем его Students .

Основные понятия

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

У каждого студента есть имя — name и фамилия last_name . Также, у него есть промежуточные оценки за весь семестр. Эти оценки мы будем записывать в целочисленный массив из пяти элементов. После того, как все пять оценок будут проставлены, определим средний балл успеваемости студента за весь семестр — свойство average_ball .

Методы — это функции, которые могут выполнять какие-либо действия над данными (свойствами) класса. Добавим в наш класс функцию calculate_average_ball() , которая будет определять средний балл успеваемости ученика.

  • Методы класса — это его функции.
  • Свойства класса — его переменные.

Функция calculate_average_ball() просто делит сумму всех промежуточных оценок на их количество.

Модификаторы доступа public и private

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

Закрытые данные класса размещаются после модификатора доступа private . Если отсутствует модификатор public , то все функции и переменные, по умолчанию являются закрытыми (как в первом примере).

Обычно, приватными делают все свойства класса, а публичными — его методы. Все действия с закрытыми свойствами класса реализуются через его методы. Рассмотрим следующий код.

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

Функция set_average_ball() принимает средний балл в качестве параметра и присваивает его значение закрытой переменной average_ball . Функция get_average_ball() просто возвращает значение этой переменной.

Программа учета успеваемости студентов

Создадим программу, которая будет заниматься учетом успеваемости студентов в группе. Создайте заголовочный файл students.h, в котором будет находиться класс Students .

Мы добавили в наш класс новые методы, а также сделали приватными все его свойства. Функция set_name() сохраняет имя студента в переменной name , а get_name() возвращает значение этой переменной. Принцип работы функций set_last_name() и get_last_name() аналогичен.

Функция set_scores() принимает массив с промежуточными оценками и сохраняет их в приватную переменную int scores[5] .

Теперь создайте файл main.cpp со следующим содержимым.

В самом начале программы создается объект класса Students . Дело в том, что сам класс является только описанием его объекта. Класс Students является описанием любого из студентов, у которого есть имя, фамилия и возможность получения оценок.

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

После создания объекта student , мы вводим с клавиатуры фамилию, имя и промежуточные оценки для конкретного ученика. Пускай это будет Вася Пупкин, у которого есть пять оценок за семестр — две тройки, две четверки и одна пятерка.

Введенные данные мы передаем set-функциям, которые присваивают их закрытым переменным класса. После того, как были введены промежуточные оценки, мы высчитываем средний балл на основе этих оценок, а затем сохраняем это значение в закрытом свойстве average_ball , с помощью функции set_average_ball() .

Скомпилируйте и запустите программу.

Отделение данных от логики

Вынесем реализацию всех методов класса в отдельный файл students.cpp.

А в заголовочном файле students.h оставим только прототипы этих методов.

Такой подход называется абстракцией данных — одного из фундаментальных принципов объектно-ориентированного программирования. К примеру, если кто-то другой захочет использовать наш класс в своем коде, ему не обязательно знать, как именно высчитывается средний балл. Он просто будет использовать функцию calculate_average_ball() из второго примера, не вникая в алгоритм ее работы.

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

В начале обучения мы говорили о пространствах имен (namespaces). Каждый класс в C++ использует свое пространство имен. Это сделано для того, чтобы избежать конфликтов при именовании переменных и функций. В файле students.cpp мы используем оператор принадлежности :: перед именем каждой функции. Это делается для того, чтобы указать компилятору, что эти функции принадлежат классу Students .

Создание объекта через указатель

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

Конструктор и деструктор класса

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

Деструктор класса вызывается при уничтожении объекта. Имя деструктора аналогично имени конструктора, только в начале ставится знак тильды ~ . Деструктор не имеет входных параметров.

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

Синтаксически метод выглядит следующим образом:

  • modifiers – необязательные модификаторы доступа;
  • type – возвращаемый тип данных:
    • если метод не возвращает значения, то используется тип void;
    • если возвращает, то в теле метода должно присутствовать ключевое слово return, после которого указывается возвращаемое значение(того же типа что и тип метода);

    Рассмотрим примеры методов:

    Все три метода вызываются в основном методе программы – Main. Они имеют модификатор доступа static. Первые два метода типа void, то есть ничего не возвращают.
    PrintHelloWorld – вызывает Console.WriteLine с текстовым аргументом.
    PrintHello – принимает в качестве аргумента текстовую строку и после модификации текста, передает его в другой метод Console.WriteLine, который выводит текст в консоль.
    Cube – принимает на вход целое число, возводит его в куб и возвращает результат.

    Когда использовать методы

    Если часть кода повторяется два и больше раз, то есть смысл вынести инструкции в отдельный метод. Рассмотрим пример ввода элементов массива с клавиатуры:

    В качестве аргументов, методу передаются: название массива и количество элементов(длина).

    После этого, метод можно многократно использовать, для создания новых массивов целых чисел:

    Оператор return

    Оператор return завершает выполнение метода, и может возвращать значение. Инструкции которые размещены после return игнорируются. В методе разрешается многократное использование оператора return, но иногда это усложняет читабельность кода программы. Если метод имеет тип void – оператор return может использоваться для преждевременного выхода:

    Параметры методов

    Параметры метода позволяют передавать в него некоторые данные. Во время вызова метода, параметры передаются в том же порядке, в котором они описаны. То есть значения аргумента присваивается параметру в зависимости от его позиции в списке параметров.

    Передача параметров по значению

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

    Передача параметров по ссылке

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

    Модификатор ref указывается как в описании, так и при вызове метода.

    Выходные параметры

    Рассмотрим метод для деления двух чисел, он возвращает текст ошибки, если деление не возможно, а в качестве выходного параметра – результат операции:

    • переменная объявляется перед вызовом метода;
    • переменная объявляется в списке аргументов.

    Выходному параметру, в теле метода, обязательно должно быть присвоено значение.
    Как и в случае с ref, модификатор out указывается в описании и при вызове метода.

    Именованные аргументы

    Пример программы с именованными аргументами:

    Опциональные параметры

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

    Рассмотрим пример метода для вычисления процентов по банковскому депозиту. Обычная депозитная ставка 10%, кроме того, постоянные клиенты могут получить бонус:

    Необязательные параметры должны быть последними в списке аргументов метода.

    Упрощенная запись методов

    К примеру, математическую функцию y = x 2 - 2/x, можно записать:

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

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

    Локальные функции

    Для всех рассмотренных методов используется модификатор static, поскольку предполагается их непосредственное использование в главном методе программы – Main.

    У меня задание создать метод, который определяет знак зодиака по введенной дате рождения(день и месяц).

    Я создал метод, которому передаются параметры d и m , и в соответствии с введенными данными выводится текст со знаком зодиака.
    Вызываю я его через FindZ(d, m)

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

    Написать еще два способа решения
    int c = 0, k; Console.WriteLine("Введите число"); k =.


    Два способа подключить библиотеку к проекту: через references и DllImport - в чем отличие
    Всем привет. Есть два способа подключить библиотеку к проекту: через references и DllImport, а в.

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