Владимир Волков - Программирование для карманных компьютеров
- Название:Программирование для карманных компьютеров
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Владимир Волков - Программирование для карманных компьютеров краткое содержание
Эта книга предназначена для того, чтобы читатель смог быстро научиться создавать мощные и эффективные приложения для наладонных компьютеров Pocket PC. Рынок программ для карманных компьютеров сейчас бурно развивается, и именно в этой отрасли программист-одиночка может успешно соперничать с большими корпорациями, которые создают программное обеспечение. Прочитав эту книгу, читатель сможет уверенно и быстро разрабатывать достаточно сложные приложения для Pocket PC. Огромное количество разнообразных примеров позволит быстро совершенствоваться и развиваться, обогащая свой опыт работы.
Книга предназначена для начинающих программистов.
Программирование для карманных компьютеров - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
К подобным методикам можно отнести использование конструкторов и деструкторов. Эти методы позволяют подготовить объект к работе и осуществить «уборку рабочего места» к моменту, когда объект завершает свое существование.
Также инкапсуляция позволяет назначать методам и полям класса области видимости. Области видимости определяются директивами private, protected, public и friend. Эти модификаторы будут рассматриваться ниже.
Модификатор privateВсе члены класса, объявленные после этой директивы, видимы только для членов этого класса. Это значит, что любые методы класса могут вызывать private-методы и изменять или читать private-поля данного класса, но ни один класс (или объект) извне не может получить доступ к данным полям и методам. Таким образом, члены класса, помещенные в раздел private, предназначаются исключительно для использования внутри класса. Для внешних структур они невидимы. По умолчанию, все члены класса являются private, если явно не указано, к какой области видимости они принадлежат.
Модификатор protectedЧлены класса, объявленные как protected, сохраняют все ограничения членов класса, объявленных как private, но дочерние классы могут к ним обращаться.
Таким образом, раздел protected предназначен для создания расширенной зоны видимости для наследников данного класса и одновременно реализует защиту от внешнего доступа со стороны объектов, не являющихся наследниками данного класса.
Модификатор publicЭти члены класса видимы всем и отовсюду, и являются интерфейсом класса, то есть набором полей и методов, специально определенных для взаимодействия с внешним миром.
Модификатор friendОт обсуждения предыдущих трех директив возникает устойчивое впечатление, что классы в своем поведении очень похожи на людей. У них есть приватная зона, куда не допускается никто, зона ограниченного доступа, куда допускаются только «члены семьи», и публичная зона, которую показывают всем. Еще большее сходство с людьми классы обретают тогда, когда мы узнаем, что они могут дружить. То есть реализация языка C++ позволяет совершенно посторонним классам по-дружески (friend) получать доступ к подробностям реализации класса. Можно объявить с этим модификатором как отдельные члены класса, так и весь класс целиком. Директива friend предназначена для обеспечения доступа к отдельным классам, к private и protected областям текущего класса, к отдельным членам из этих областей, или ко всем членам класса сразу.
Упражнение 5.1 (продолжение)
22. В ранее созданном классе Dog нужно перенести поле age из области public в область private, как показано в листинге 5.11.
Листинг 5.11class Dog {
private:
int age;
public:
Dog();
…23. Теперь нужно попробовать откомпилировать проект. Но будет выведено сообщение об ошибке \'age\': cannot access private member declared in class \'Dog\'. Член класса с модификатором private не виден извне, и попытка получить к нему доступ в коде обработчика кнопки Assign обречена на неудачу.
24. Переместить поле age в область protected, как показано в листинге 5.12.
Листинг 5.12class Dog {
protected:
int age;
public:
Dog();
…25. Попытка откомпилировать проект закончится так же, как и предыдущая, поскольку снова происходит обращение к полю protected извне класса. Когда поле находилось в зоне public, такой ошибки не было.
26. Изменить метод Add класса CleverDog, как показано в листинге 5.13.
Листинг 5.13class CleverDog: public Dog {
void Add(int x, int y){
age= 200;
};27. Изменить обработчик щелчка на кнопке Assign, как показано в листинге 5.14. Листинг 5.14
case IDC_BUTTON3:
Dogs[0]->Add(0,0);
break;28. После внесения этих изменений проект нормально компилируется, и нажатие кнопки Assign не приводит к возникновению ошибки. Поскольку класс Dog является базовым классом для CleverDog, то метод Add дочернего класса получает доступ к полю age, объявленному в секции protected базового класса.
Перегрузка методов
Гибкость использования классов расширяется за счет использования перегрузки методов. Перегрузка методов позволяет объявлять в одном классе несколько методов с одним и тем же именем, но разным составом параметров. Этот принцип иллюстрируется в упражнении.
Упражнение 5.1 (продолжение)
29. Добавить в класс Dog еще один метод Speak(), объявление которого приведено в листинге 5.15. Этот метод почти ничем не отличается от уже существовавшего метода Speak(), кроме того, что он принимает в качестве параметра целое число и отображает его значение.
Листинг 5.15void Speak(int x){
char mm[32];
wchar_t *szStr = L"";
wchar_t mstr[32];
sprintf(mm,"Перегрузка, значение параметра: %d", x);
mbstowcs(mstr, mm, 32);
szStr = mstr;
MessageBox(NULL, szStr, TEXT(«TUT»), 0);
};30. Теперь нужно переписать обработчик щелчка на кнопке Assign, как показано в листинге 5.16. Листинг 5.16
case IDC_BUTTON3:
Dogs[0]->Speak();
Dogs[0]->Speak(350);
break;Компиляция и выполнение программы пройдут без ошибок. В C++ для обозначения перегруженных функций не нужны никакие особенные директивы. Компилятор, встретив функции с одинаковыми именами, но разным составом параметров, сам понимает, что они перегружены, и во время вызова функции именно по параметрам определяет, какую именно из перегруженных функций надо вызывать.
Приведение типов
В C++ есть два способа приведения типов, заимствованных из C. Можно использовать «тихое» приведение типов, когда разрядность приводимого типа меньше или равна разрядности типа, к которому осуществляется приведение. В этом случае потери информации не происходит, и приведение может быть осуществлено в момент присваивания, без применения особых операторов. Следующий фрагмент кода демонстрирует работу подобного приведения типа.byte x = 12; float y = x;
Также можно использовать явное приведение типов. Оно позволяет приводить один тип к другому при возможности потери или искажения информации. В этом случае ответственность за возможную потерю информации перекладывается на плечи программиста. Явное приведение типов выполняется при помощи оператора (). Следующий фрагмент кода демонстрирует его использование.
(const unsigned short *)szStr
Но С++ не может ограничиваться этими двумя способами приведения типов. В С++ есть еще четыре оператора приведения типа. Прежде всего следует рассмотреть оператор const_cast. Если есть указатель, объявленный с модификатором const, и его нужно передать в качестве аргумента методу, в котором указатель принимается без этого модификатора, то нужно использовать оператор const_cast. Этот оператор удаляет модификатор const из объявления передаваемого указателя. Синтаксис применения этого оператора показан ниже.
const_cast(exp)
В параметре type указывается тип, к которому приводится константа exp. Предположим, что есть некоторая функция, которая принимает в качестве аргумента указатель на int.
void my_func(int *x);
Помимо этого есть константа const int x, значение которой нужно передать в качестве аргумента в эту функцию. Вызов my_func(&x) закончится ошибкой компиляции, поскольку объявленный и передаваемый типы не соответствуют. А с преобразованием const_cast проблем не будет:
Читать дальшеИнтервал:
Закладка: