Примеры использования дружественных функций и дружественных классов в языке программирования 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.