И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++ (1114893), страница 3
Текст из файла (страница 3)
. .////////const int & aa1 = 1; //double b[10];double & bb = b[9];////ссылка обязана иметь начальноезначение!a и aa ссылаются на одно и то жецелое числобудет выведено “6 6”, посколькуa и aa — одна и та же сущность}; // адрес ссылки равен адресусамого объекта!можно инициировать ссылкуконстантным значением, еслисама ссылка тоже константная:ссылка на константу 1псевдоним для b[9] — последнегоэлемента массива bСсылка может быть определена и для динамического объекта:13Отличия C и C++int & x = * new int;В этом случае, несмотря на то, что, как было отмечено выше, ссылкас точки зрения реализации является адресом объекта, формат операции deleteбудет следующий:delete & x;При описании формального параметра функции с использованиемссылки этот параметр передается по ссылке.При передаче параметра по ссылке в функцию передается его адрес,и все изменения, происходящие с формальным параметром, происходят ис соответствующим фактическим параметром.При передаче параметра по значению создается локальная копия объекта-параметра, которая инициализируется значением соответствующегофактического параметра, при этом соответствующий фактический параметрне может изменить своего значения в теле функции.Ссылка инициализируется при передаче параметров в функцию и припередаче возвращаемого значения в виде псевдонима объекта, которыйпродолжает существовать после выхода из функции (например, ссылка натекущий объект при выходе из метода).ПримечаниеТекущий объект может быть возвращен при выходе из метода не только в видессылки на текущий объект, но и в виде объекта.
Однако, это менее эффективно, так как в этом случае создается копия текущего объекта.Пример:int & imax ( int * m ){int i;…return m[i];}int main (){int A[10];…imax(A) = 0;…}В данном примере в результате вызова функции imax() будет возвращено значение ссылки на максимальный элемент массива А. По даннойссылке этому элементу вектора может быть присвоено новое значение.14Отличия C и C++2.5.
Стандартная библиотека С++,стандартный ввод-выводДля языка С++ создана своя стандартная библиотека, которая отличается отстандартной библиотеки С. Изменения затронули, например, функции ввода-вывода, введен раздел, посвященный шаблонам (STL — стандартнаябиблиотека шаблонов, описанная ниже).Тем не менее, стандартнаяв стандартную библиотеку С++.библиотекас целикомвключенаВ С++ введен новый формат задания заголовочных файлов стандартнойбиблиотеки: без «.h», при этом все используемые в библиотеке имена погружены в стандартное пространство имен std (см. раздел 2.6).Например, в С++ файл заголовков ввода-вывода называется iostream,и для его подключения необходимо использовать директиву:#include <iostream>Чтобы подключить к программe на С++ заголовочный файл стандартной библиотеки с в новом формате, надо добавить в начало названия соответствующего файла букву с.
Например,#include <cstdio>В файле стандартной библиотеки С++ ‹iostream› введены классы, соответствующие стандартным (консольным) потокам ввода (класс istream)и вывода (класс ostream), а также объекты этих классов: cin — объект классаistream, cout, cerr — объекты класса оstream.Через эти объекты для базовыхтипов данных доступны операции ввода ›› из стандартного потока ввода,например,cin >> x;и вывода ‹‹ в стандартный поток вывода (cout) или стандартный файл ошибок(cerr), например,cout << "String" << S << endl;При этом явно не указываются никакие форматирующие элементы:endl — константа, обозначающая конец строки, она так же определенав файле ‹iostream›.Стандартная библиотека С++:1) обеспечивает поддержку свойств языка, например, управление памятью (функции, основанные на использовании операций newи delete);2) предоставляет информацию о типах во время выполнения программы (RTTI);15Отличия C и C++3) обеспечивает поддержку обработки исключений (стандартные исключения);4) предоставляет информацию о зависящих от реализации аспектахязыка (например, максимальное значение float);5) предоставляет программисту общеупотребительные математические и некоторые другие функции (например, sqrt(), генератор случайных чисел и т.
д.);6) предоставляет программисту некоторые нетривиальные и машинно-зависимые средства, что позволяет писать переносимыепрограммы (например, списки, функции сортировки, потоки ввода/вывода).С подробным описанием стандартной библиотеки C++ можно познакомиться в [12], часть III «Стандартная библиотека».2.6. Пространства имен,пространство имен «std».Операция «::»В C++ так же, как и в языке программирования C, используется обычныймеханизм разрешения видимости имен по принципу локализации.Кроме того, в С++ введено понятие пространства имен. Пространствоимен является областью видимости и позволяет локализовать имена, описанные внутри этого пространства, что бывает полезно, например, для устранения коллизий имен, которые могут возникнуть при написании одногопрограммного продукта разными программистами.Пространства имен задаются следующим образом:namespace имя_пространства_имен{.
. . описания . . .}Пример:namespace A{int x;void f ();…}В С++ также введена операция разрешения области видимости имен«::», которая расширяет имя, определяя из какого пространства имен (илиобласти видимости) данное имя выбирается.Если используется имя из текущей области видимости или имя изобъемлющей области видимости, не совпадающее ни с одним именем из те16Отличия C и C++кущей области , оно записывается обычным образом, если же нужно совпадающее имя из объемлющей области или имя из другой области видимости,это имя можно записать следующим образом:имя_области_видимости :: имяИдентификатор области видимости слева от операции «::» называетсяквалификатором.C++ унаследовал от языка программирования C единое глобальноепространство имен. Если необходимо использовать глобальную переменную,находящуюся вне пространств имен, то для устранения неоднозначностииспользуется операция «::» без квалификатора.Пример:char c;namespace x{char c;void f(char e){::c = c = e;}}Пространства имен могут быть вложенными.Пример:namespace ns1{int n;.
. .namespace ns2{int sq(){return n*n;}void print_ns();. . .}void ns2::print_ns(){cout << "namespace ns2" << endl;}}При обращении к объекту, находящемуся во вложенном пространствеимен, например, из глобального пространства имен используются несколькоквалификаторов:ns1::ns2::print_ns();Для сокращения записи имен используется объявление имени из пространства имен (using-объявление), например:17Отличия C и C++using namespace ns1;В этом случае идентификаторы из указанной области можно использовать без квалификаторов вплоть до нового объявления пространства имен(using). Подробно об использовании using-объявления см. в [12, стр.
211–216,924–926].Введение понятия пространства имен является одним из видов статического полиморфизма: одинаковым идентификаторам придается разныйсмысл.Имена стандартной библиотеки С++ находятся в пространстве имен std.Поскольку функции, типы и константы стандартной библиотеки используются практически в каждой программе, рекомендуется для удобства использования имен стандартной библиотеки в начало программы вставлятьusing-объявление:using namespace std;18Классы и объекты С++Глава 3.Классы и объекты С++Центральным понятием ООП является класс. Класс используется для описания типа, на основе которого создаются объекты (переменные типа класс).Класс, как и любой тип данных, характеризуется множеством значений,которые могут принимать объекты класса, и множеством функций, задающих операции над объектами.Пример:Имеется множество пар чисел (a, b).Если для данного множества определить арифметические операцииследующим образом:(a, b) + (c, d) = (ad + bc, bd)(a, b) − (c, d) = (ad − bc, bd)(a, b) × (c, d) = (ac, bd)(a, b) ÷ (c, d) = (ad, bc)то это множество можно рассматривать как множество рациональных дробей: (a, b) →abЕсли же арифметические операции определить по-другому:(a, b) + (c, d) = (a + c, b + d)(a, b) − (c, d) = (a − c, b − d)(a, b) × (c, d) = (ac − bd, ad + bc)⎛ ac + bd bc − ad ⎞, 2(a, b) ÷ (c, d) = ⎜ 222 ⎟⎝c +d c +d ⎠это же множество пар чисел можно рассматривать как множество комплексных чисел: (a, b) → a + bi.Класс полноценно определяет тип данных как совокупность множествазначений и набора операций над этими значениями.3.1.
Синтаксис описания классаСинтаксис описания класса:19Классы и объекты С++class Имя_класса { определение_членов_класса };Члены класса можно разделить на информационные членыи функции-члены (методы) класса. Информационные члены описываютвнутреннюю структуру информации, хранящейся в объекте, который создается на основе класса. Методы класса описывают алгоритмы обработки этойинформации.Данные, хранящиеся в информационных членах, описывают состояниеобъекта, созданного на основе класса.
Состояние объекта изменяется на основе изменения хранящихся данных с помощью методов класса. Алгоритмы,заложенные в реализации методов класса, определяют поведение объекта, тоесть реагирование объекта на поступающие внешние воздействия в видевходных данных.3.2. Управление доступом кчленам классаПринцип инкапсуляции обеспечивается вводом в класс областей доступа:— private— закрытый, доступный только собственным методам;— public— открытый, доступный любым функциям;— protected— защищенный, доступный только собственным методам и методам производных классов.Члены класса, находящиеся в закрытой области (private), недоступныдля использования со стороны внешнего кода.
Напротив, члены класса, находящиеся в открытой секции (public), доступны для использования со стороны внешнего кода. При описании класса каждый член класса помещаетсяв одну из перечисленных выше областей доступа следующим образом:class Имя_класса{private:определение_закрытых_членов_классаpublic:определение_открытых_членов_классаprotected:определение_защищенных_членов_класса...};Порядок следования областей доступа и их количество в классе —произвольны.Служебное слово, определяющее первую область доступа, может отсутствовать. По умолчанию эта область считается private.В закрытую (private) область обычно помещаются информационныечлены, а в открытую (public) область — методы класса, реализующие интерфейс объектов класса с внешней средой. Если какой-либо метод имеетвспомогательное значение для других методов класса, являясь подпрограм-20Классы и объекты С++мой для них, то его также следует поместить в закрытую область.