Примеры использования дружественных функций и дружественных классов в языке программирования C++
Примеры, демонстрирующие принципы дружественности, принятые в языке программирования C++. Использование дружественной функции двух классов "Правильный треугольник" и "Окружность", проверяющей, можно ли поместить заданную окружность внутри треугольника.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | статья |
Язык | русский |
Дата добавления | 31.07.2018 |
Размер файла | 16,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru//
Размещено на http://www.allbest.ru//
Башкирский государственный университет
Примеры использования дружественных функций и дружественных классов в языке программирования C++
Дмитриев Владислав Леонидович
кандидат наук, доцент, доцент
В статье рассматривается несколько примеров, демонстрирующих основные принципы дружественности, принятые в языке программирования C++. Приведенные реализации могут рассматриваться при изучении объектно-ориентированного программирования и будут интересны как школьникам, так и студентам.
Язык программирования C++ широко используется для разработки программного обеспечения, и является одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разработку прикладных программ, написание драйверов устройств, а также развлекательных приложений. В настоящее время существует множество реализаций языка C++, как коммерческих, так и бесплатных (например, Microsoft Visual C++ 2005-2013).
Особое внимание при изучении программирования следует уделять объектно-ориентированному программированию [1], при этом первоначальное ознакомление с ним можно проводить, в том числе, и на основе языка Pascal [3]. Однако, по мнению автора, более предпочтительно все-таки использование языка программирования C++, в котором объектовый тип чаще называют классом. Классы позволяют моделировать объекты, имеющие атрибуты (данные-элементы, представляемые в виде полей) и варианты поведения или операции (функции-элементы, функции-члены или методы класса).
В данной статье автор предлагает несколько примеров, посвященных изучению отношения дружественности в языке программирования C++ [5]. Предполагается, что учащиеся уже имеют базовые представления о языке программирования C++ и о разработке классов на его основе.
Известно, что функции, объявленные как дружественные некоторому классу, имеют доступ к закрытым элементам private (и protected) данного класса и используются для повышения производительности; они определяются вне области действия класса. Так, например, дружественную функцию целесообразно использовать в случае организации взаимодействия нескольких объектов разных классов, когда обеспечивающая такое взаимодействие функция должна иметь доступ к закрытым полям нескольких объектов. При этом функция или класс в целом могут быть объявлены другом другого класса. Объявление дружественности не зависит от спецификаторов доступа, и обычно дружественные функции объявляются в начале тела класса.
Для объявления функции другом класса перед ее прототипом в описании класса указывают ключевое слово friend. Например, чтобы объявить класс Class_2 другом класса Class_1, нужно в определении класса Class_1 записать объявление в форме: friend Class_2.
Приведем пример использования дружественной функции двух классов - класса «Правильный треугольник» и класса «Окружность», которая проверяет, можно ли поместить заданную окружность внутри заданного треугольника. дружественный класс треугольник
#include "stdafx.h"
#include
#include
using namespace std;
class Triangle;
class Circle
{friend bool Relation(Triangle,Circle);
public:
Circle(float x=1) {r=x;}
void Set(float x) {r=x;} //Задание радиуса окружности
private:
double r; //Радиусокружности
};
class Triangle
{friend bool Relation(Triangle,Circle);
public:
Triangle(double x=1) {a=x;}
void Set(double x) {a=x;} //Задание стороны треугольника
private:
double a; //Сторонатреугольника
};
bool Relation(Triangle A, Circle B)
{if (B.r
Дружественная некоторому классу функция может являться компонентной функцией другого класса. Для демонстрации этого рассмотрим предыдущий пример, в котором функция Relation() является одним из методов класса Triangle, и при этом объявлена дружественной классу Circle.
#include "stdafx.h"
#include
#include
using namespace std;
class Circle;
class Triangle
{public:
Triangle(double x=1) {a=x;}
bool Relation(Circle);
void Set(double x) {a=x;} //Задание стороны треугольника
private:
double a; //Сторонатреугольника
};
class Circle
{friend bool Triangle::Relation(Circle); //Дружественнаяфункция-
//методкласса Triangle
public:
Circle(double x=1) {r=x;}
void Set(double x) {r=x;} //Задание радиуса окружности
private:
double r; //Радиусокружности
};
bool Triangle::Relation(Circle A)
{if (A.r
Как было отмечено выше, кроме дружественной функции для данного класса можно объявить дружественным целый класс. При этом все методы дружественного класса имеют доступ к закрытым и защищенным компонентам того класса, в котором он объявлен другом. Рассмотрим взаимодействие дружественных классов на основе следующего примера, в котором кроме класса «Клиент банка» определен еще и класс «Банк». Взаимодействие этих классов организовано таким образом, что класс Bank объявлен дружественным классу Client (методы класса Bank будут иметь доступ к закрытым полям и методам класса Client). Класс «Банк» хранит список всех своих клиентов, причем этот список оформлен в виде динамического односвязного списка (это позволяет не накладывать ограничений на максимально допустимое количество клиентов банка). При этом класс «Клиент банка» организован таким образом, что в нем все поля и методы, в том числе и конструктор с деструктором, описаны в разделе private. Это означает, что в основной программе будет запрещено даже создание экземпляра объекта класса Client.
#include "stdafx.h"
#include
#include
#include
using namespace std;
class Bank;
class Client
{friend class Bank; //Объявление дружественного класса
private:
Client(char*, char*, double);
char* Name; //ФИО клиента
Client *NEXT; //Адрес следующего клиента в списке клиентов
char Nomer[1][5]; //Номер счета клиента
double Sum; //Сумма на счету клиента
void Out(); //Вывод информации о клиенте
void Set(); //Ввод информации о клиенте
~Client() {delete [ ]Name;} };
Client::Client(char* Ch="No Name", char* N="00000", double S=0)
{Name=new char[strlen(Ch)+1];
strcpy(Name,Ch);
strcpy(Nomer[0],N);
Sum=S;}
void Client::Out()
{cout>Nomer[0];
cout>Sum;}
class Bank
{public:
Bank(char*);
double Percent; //Процентная ставка по вкладу
void AddPercent(char*); //Начисление процентов на счет клиента
void ChangeSum(char*, double); //Добавление (снятие) суммы со
//счета
void OutAllClient(); //Вывод информации о всех клиентах
void AddClient(); //Добавление нового клиента в список клиентов
~Bank(); //Деструктор
private:
int Count; //Количество клиентов банка
char BankName[30]; //Название банка
Client* BEGIN; //Адрес первого клиента в списке клиентов
Client* END; //Адрес последнего клиента в списке клиентов
};
Bank::Bank(char* Ch)
{Count=0;
BEGIN=END=NULL;
strcpy(BankName,Ch);
Percent=0.1;}
void Bank::AddPercent(char* Ch)
{Client* Vrem;
int i,j;
Vrem=BEGIN;
while (Vrem) {j=0;
for (i=0; iNEXT;} }
void Bank::ChangeSum(char* Ch, double p)
{Client* Vrem;
int i,j;
Vrem=BEGIN;
while (Vrem) {j=0;
for (i=0; i=0) (*Vrem).Sum+=p;
else coutNEXT;} }
void Bank::AddClient()
{if (Count) {END->NEXT=new Client;
END=END->NEXT;
END->Set();
END->NEXT=NULL;}
else {BEGIN=new Client;
END=BEGIN;
END->NEXT=NULL;
END->Set();}
Count++;}
void Bank::OutAllClient()
{Client* Vrem;
Vrem=BEGIN;
coutOut();
Vrem=Vrem->NEXT;} }
Bank::~Bank()
{if (Count) {Client* Vrem=BEGIN;
while (Vrem) {Vrem=BEGIN->NEXT;
delete BEGIN;
BEGIN=Vrem;} } }
int main()
{ setlocale(LC_ALL,"Rus");
Bank A("УралСиб");
char c=0;
while (c!=27)
{ cin.sync();
A.AddClient();
cout
Дружественность не обладает ни свойством симметричности, ни свойством транзитивности. Это означает, что если класс А - друг класса В, а класс В - друг класса С, то отсюда не следует, что: класс А - друг класса С; класс В - друг класса А, класс С - друг класса В.
Таким образом, на достаточно простых примерах можно показать учащимся основные принципы использования дружественных функций и классов. При этом, однако, нужно указать на то, что отношение дружественности нужно использовать только при явной необходимости, т.к. чрезмерное злоупотребление может привести к нарушению инкапсуляции классов и, как следствие, к снижению степени защиты разрабатываемого приложения.
В заключение отмечу, что в плане проверки уровня усвоения учащимися учебного материала может оказаться удобным использование всевозможных программ-тестов [6, 7] .
Хочется также отметить следующее: чтобы научиться программировать, далеко не достаточно прочитать книгу, посвященную тому или иному языку программирования, надо писать свои программы, постепенно усложняя поставленные перед собой задачи [4, 8]. Прежде чем писать программу для решения конкретной задачи, необходимо досконально понять задачу и тщательно спланировать пути ее решения. Конечно, тщательное планирование следует относить в какой-то мере только к небольшим задачам, так как в процессе реализации большого проекта, возможно, придется отказаться от намеченного алгоритма решения задачи (или какой-то ее части) в пользу какого-либо более оптимального алгоритма. Кроме того, необходимо постоянно находиться в творческом поиске, так как путей решения поставленной задачи может быть несколько [2].
Список литературы
Бабушкина И.А., Окулов С.М. Практикум по объектно-ориентированному программированию. - М.: "БИНОМ. Лаборатория знаний". 2012. - 371 с.
Дмитриев В.Л., Ахмадеева Р.З. Развитие конструктивного мышления при изучении программирования // Информатика и образование. 2009. № 2. - С. 69-73.
Дмитриев В.Л. Развитие представлений об объектном программировании на примере разработки объектов в среде программирования Turbo Pascal // Информатика в школе. 2014. № 2 (95). - С. 54-59.
Дмитриев В.Л. Теория и практика решения задач по программированию. Ч.1. Уфа: РИЦ БашГУ. 2007. - 264 с.
Дмитриев В.Л. Теория и практика программирования на С++. - Стерлитамак: РИО СФ БашГУ. 2013. - 315 с.
Дмитриев В.Л. Тестирование в игровой форме как способ проверки усвоения учебного материала // Информатика в школе. 2012. №10 (83). - С. 41-43.
Дмитриев В.Л. Компьютерная программа для проведения тестирования с поддержкой произвольного расположения материалов теста // Информатика и образование. 2014. №2 (251). - С. 74-77.
Окулов С.М. Программирование в алгоритмах. - М.: БИНОМ. Лаборатория знаний. 2002. - 341 с.
Размещено на Allbest.ru
...Подобные документы
Основные этапы определения радиуса и центра окружности, проходящей через три различные точки заданного множества точек. Особенности построения алгоритма на языке программирования. Составление тестовых примеров для демонстрации возможностей программы.
контрольная работа [103,9 K], добавлен 21.08.2013Понятия шаблонов функции и класса, правила описания на языке С++. Разработка и отлаживание в среде программирования программ, содержащих шаблоны функций и классов. Шаблон функции square, возвращающей квадрат переменной. Создание шаблона класса массива.
лабораторная работа [162,6 K], добавлен 25.05.2013История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.
курсовая работа [795,9 K], добавлен 14.12.2012Исследование общих принципов программирования на языке Assembler для 32-х разрядных и 64-х разрядных процессоров. Изучение основных отличий архитектур i686 и amd64. Работа со стеком. Передача параметров в функции. Смена способа адресации внутри программы.
контрольная работа [118,2 K], добавлен 10.02.2015Анализ затрат и прибыли. Создание программного проекта для решения задачи о прибыли и убытках на языке программирования C#. Использование функций и переменных, компиляция программы. Алгоритмы и структуры данных. Тестирование программного обеспечения.
курсовая работа [1,2 M], добавлен 03.01.2015Создание класса wind, характеризующего ветровой режим, и программы, демонстрирующей применение разработанного класса. Программный модуль на языке программирования C++ в среде программирования C++Builder6/0, демонстрирующая работу с классом wind.
курсовая работа [123,5 K], добавлен 24.06.2010Изучение объектно-ориентированного языка программирования Java, его функциональные возможности. Создание программного кода. Описание классов и методов, использованных в программе. Руководство пользователя, запуск сервера и клиентского приложения.
курсовая работа [1,8 M], добавлен 16.09.2015Характеристика основных принципов объектно-ориентированного программирования. Этапы разработки программы на языке C++, реализующей игру "Морской бой". Выбор языка программирования. Характеристика необходимых классов, наследований, виртуальных методов.
курсовая работа [657,6 K], добавлен 17.06.2012Разработка структуры класса "Экран курсового проектирования", которая будет основой для хранения информации о студентах, выполняющих курсовые работы. Реализация визуального приложения для тестирования иерархии классов на языке программирования С++.
курсовая работа [3,3 M], добавлен 18.03.2011Сумма двух разреженных полиномов, заданных ненулевыми коэффициентами и их номерами. Разработка программ на языке программирования Visual Basic for Applications. Вывод справочной информации. Операционная система Windows. Хранение двоичных данных.
научная работа [390,2 K], добавлен 09.03.2009Ознакомление с особенностями применения функций в языке Си++. Рассмотрение понятия прототипа, определение областей его применения. Изучение сущности автоматических, статистических и регистровых переменных, их использование при составлении программ.
лабораторная работа [24,0 K], добавлен 15.07.2010Язык программирования Турбо Паскаль. Запись алгоритма на языке программирования и отладка программы. Правила записи арифметических выражений. Стандартное расширение имени файла, созданного системным редактором. Составной оператор и вложенные условия.
курсовая работа [75,0 K], добавлен 21.03.2013Изучение 32-х битного программирования на ассемблере. Рассмотрение ресурса как некого визуального элемента с заданными свойствами, его выгоды, примеры использования. Используемые функции. Редакторы и трансляторы ресурсов. Результат работы программы.
курсовая работа [719,5 K], добавлен 18.05.2014Характеристика основных разделов программирования, изучаемых в курсе программирования на языке С++. Описание внутренних переменных, входных и выходных данных. Особенности использования компилятора Microsoft Visual Studio 2008. Руководство пользователя.
курсовая работа [18,8 K], добавлен 14.12.2010Разработка Windows-приложений с использованием библиотеки MFC. Базовый набор классов, написанных на языке С++ и предназначенных для упрощения процесса программирования под Windows. Фундаментальные идеи объектно-ориентированного программирования.
курсовая работа [348,1 K], добавлен 02.07.2011Основные приёмы и возможности алгоритмических языков программирования Fortran. Табуляция функции на языке Fortran, ее графический вид и блок-схема алгоритма. Выполнение расчетов на алгоритмическом языке Фортран. Текст (листинг) Fortran-программы.
курсовая работа [31,9 K], добавлен 15.02.2011Сущность и функции языков программирования, их эволюция и оценка популярности различных видов. Особенности компьютерных программ, разработанных на компилируемом, интерпретируемом или смешанном языке. Основные классы и иерархия языков программирования.
презентация [873,4 K], добавлен 23.01.2013Обзор образовательных ресурсов для реализации дистанционного обучения. Разработка рабочей программы курса видеолекций "Основы программирования на языке C+". Подбор контента, аппаратных средств. Проведение чат-занятий, использование сетевой технологии.
дипломная работа [155,0 K], добавлен 28.06.2014Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).
курсовая работа [29,7 K], добавлен 29.10.2011Описание функций, использующихся в программах. Основы 32-битного программирования на языке Assembler для ОС WINDOWS. Использование функции invoke, которая позволяет намного сократить текст программы и делает приложения похожими на программы для "ЯВы".
курсовая работа [252,6 K], добавлен 20.02.2015