Читаем C++ полностью

Описание date в предыдущем подразделе дает множество функций для работы с date, но не указывает, что эти функции должны быть единственными для доступа к объектам типа date. Это ограничение можно наложить используя вместо struct class:

class date (* int month, day, year; public: void set(int, int, int); void get(int*, int*, int*); void next; void print; *);

Метка public: делит тело класса на две части. Имена в первой, закрытой части, могут использоваться только функциями членами. Вторая, открытая часть, составляет интерфейс к обекту класса. Struct – это просто class, у которого все члены классы открытые, поэтому функции члены определяются и исползуются точно так же, как в предыдущем случае. Например:

void date::ptinr // печатает в записи, принятой в США (* cout «« month «« "/" «« day «« "/" year; *)

Однако функции не члены отгорожены от использования зарытых членов класса date. Например:

void backdate (* today.day–; // ошибка *)

В том, что доступ к структуре данных ограничен явно опсанным списком функций, есть несколько преимуществ. Любая ошибка, которая приводит к тому, что дата принимает недопутимое значение (например, Декабрь 36, 1985) должна быть вывана кодом функции члена, поэтому первая стадия отладки, лкализация, выполняется еще до того, как программа будет запущена. Это частный случай общего утверждения, что любое изменение в поведении типа date может и должно вызываться именениями в его членах. Другое преимущество – это то, что птенциальному пользователю такого типа нужно будет только унать определение функций членов, чтобы научиться им пользоваться.

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

5.2.3 Ссылки на себя

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

class x (* int m; public: int readm (* return m; *) *);

x aa; x bb;

void f (* int a = aa.readm; int b = bb.readm; // ... *)

В первом вызове члена member m относится к aa.m, а во втором – к bb.m.

Указатель на объект, для которого вызвана функция член, является скрытым параметром функции. На этот неявный параметр можно ссылаться явно как на this. В каждой функции класса x указатель this неявно описан как

x* this;

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

class x (* int m; public: int readm (* return this-»m; *) *);

При ссылке на члены использование this излишне. Главным образом this используется при написании функций членов, котрые манипулируют непосредственно указателями. Типичный пример этого – функция, вставляющая звено в дважды связанный список:

class dlink (* dlink* pre; // предшествующий dlink* suc; // следующий public: void append(dlink*); // ... *);

void dlink::append(dlink* p) (* p-»suc = suc; // то есть, p-»suc = this-»suc p-»pre = this; // явное использование this suc-»pre = p; // то есть, this-»suc-»pre = p suc = p; // то есть, this-»suc = p *)

dlink* list_head;

void f(dlink*a, dlink *b) (* // ... list_head-»append(a); list_head-»append(b); *)

Цепочки такой общей природы являются основой для списквых классов, которые описываются в Главе 7. Чтобы присоеднить звено к списку необходимо обновить объекты, на которые указывают указатели this, pre и suc (текущий, предыдущий и последующий). Все они типа dlink, поэтому функция член dlink::append имеет к ним доступ. Единицей защиты в С++ яляется class, а не отдельный объект класса.

5.2.4 Инициализация

Использование для обеспечения инициализации объекта класса функций вроде set_date (установить дату) неэлегантно и чревато ошибками. Поскольку нигде не утверждается, что обект должен быть инициализирован, то программист может забыть это сделать, или (что приводит, как правило, к столь же рарушительным последствиям) сделать это дважды. Есть более хроший подход: дать возможность программисту описать функцию, явно предназначенную для инициализации объектов. Поскольку такая функция конструирует значения данного типа, она назывется конструктором. Конструктор распознается по тому, что имеет то же имя, что и сам класс. Например:

class date (* // ... date(int, int, int); *);

Когда класс имеет конструктор, все объекты этого класса будут инициализироваться. Если для конструктора нужны парметры, они должны даваться:

date today = date(23,6,1983); date xmas(25,12,0); // сокращенная форма // (xmas – рождество) date my_burthday; // недопустимо,опущена инициализация

Часто бывает хорошо обеспечить несколько способов иницализации объекта класса. Это можно сделать, задав несколько конструкторов. Например:

class date (* int month, day, year; public: // ... date(int, int, int); // день месяц год date(char*); // дата в строковом представлении date(int); // день, месяц и год сегодняшние date; // дата по умолчанию: сегодня *);

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Татьяна Коротяева , Нейл Мэтью , Ричард Стоунс

ОС и Сети / Программирование / Книги по IT
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT