Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Указатели. Указатели являются одной из сильных сторон С++

Читайте также:
  1. VI. Сигнальные указатели и знаки на железнодорожном транспорте
  2. Переменные-указатели
  3. Реализация программы через указатели на функции
  4. Указатели
  5. Х. Сигналы тревоги и специальные указатели

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

С указателями используются следующие операции:

& - взятие адреса переменной;

* - разъименование указателя, т.е. получение доступа к объекту;

-> - разъименование члена структуры;

[] - индексация, доступ к элементу массива, при этом считается, что указатель содержит адрес 0 элемента.

Операция индексации может быть реализована с помощью адресной арифметики, где применяются операции ++,--, и +, -.

Можно создавать указатели на любые типы за исключением ссылок и битовых полей. Указатель может указывать не только на данные, но и на область кода, т.е. на функцию.

95.

Функция элемент - это функция, объявленная внутри определения класса и тесно связанная с типом этого класса.

Общий вид синтаксиса вызова выглядит как:

имя_класса_объекта.имя_функции(список аргументов).

sber_bank

Объект сбербанк

< deposit << Вклад денег

$$$ < >

<

Данные > withdraw >> Снятие денег

Функции элементы

Наглядное представление функции элемента withdraw() приводится ниже:

Селектор

Определяемый класс Имя функции элемента

Возвращаемый тип Аргумент

v v v v v

double sber_bank::withdraw(double bucks)

{

big_bucks -= bucks;

if (big_bucks < 0.0) {

printf("К сожалению, товарищ, у вас нет таких денег!\n");

big_bucks -= 10.0; // Штрафная санкция

}

return big_bucks;

}

Имя класса sber_bank используется для указания компилятору, к какому классу принадлежит withdraw (так как могут иметься и другие варианты withdraw, принадлежащие другим классам). При внутреннем определении селектор '::' не потребуется, так как и так ясно, что withdraw принадлежит классу sber_bank.

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

Объект Имя функции элемента

v v

my_bank.deposit(paycheck);

^ ^ ^

Простой селектор

в обращении к задан- Вызов функции элемента

ному элементу струк-

туры

 

96.

Функции-члены могут определяться вне списка членов класса. При определении функции-члена класса за пределами данного класса, в списке членов класса размещается прототип функции-члена. А при определении функции-члена используется квалифицированное имя. Квалифицированное имя состоит из последовательности имён классов, разделённых операциями разрешения области видимости. Эта последовательность имён завершается именем определяемой функции. Последовательность имён классов в квалифицированных именах определяется степенью вложенности объявлений классов.

Наличие функций-членов делает объявление класса подобным определению (как и любые функции, функции-члены определяются). Как сказано в Справочном руководстве по C++, "Если бы не исторические причины, объявление класса следовало называть определением класса".

Данные-члены класса не могут объявляться со спецификаторами auto, extern, register.

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

 

97.

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

Friend им_функции (список_формальных_параметров); Дружественная функция имеет доступ ко всем компонентам класса вне зависимости от их области видимости. Дружественная функция класса может быть обычной внешней функцией программы, а может – компонентной функцией другого класса.

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

Рассмотрим простой пример.

Дружественные функции классов

class ClassB;

class ClassA

{ int x;

friend void func(ClassA,ClassB); //объявляем функцию дружественной классу ClassA

};

class ClassB

{ int y;

friend void func(ClassA,ClassB); //объявляем функцию дружественной классу ClassВ

};

void func(ClassA a,ClassB b)

{

cout <<a.x+b.y;//дружественная функция имеет доступ к частным компонентам обоих

// классов

}

main()

{

ClassA a;

ClassB b;

func(a,b);

}

В определены два класса ClassA и ClassB, а также внеш

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

Дружественная классу функция может быть компонентной функцией другого класса.

 

98.

99.

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

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

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

 

100.


Дата добавления: 2015-07-26; просмотров: 50 | Нарушение авторских прав


Читайте в этой же книге: Функция gets(). 5 страница | Функция gets(). 6 страница | Функция gets(). 7 страница | Целый тип данных | Указатели | Инициализация данных | Структуры | Синтаксис описания шаблона | Полиморфизм | Иерархия классов |
<== предыдущая страница | следующая страница ==>
Связь с указателями| ПРЕДСТАВЛЕНИЕ О ДЕСТРУКТОРЕ

mybiblioteka.su - 2015-2024 год. (0.009 сек.)