
- •Лабораторная работа.4. Знакомство со средой разработки. Основы создания классов
- •Среда разработки Visual Studio 2005. Hello new word!
- •Вывод результатов компиляции и диагностики приложения
- •Инструментарий отладки Visual Studio
- •Использование точек останова
- •Контроль значений переменных при пошаговом выполнении
- •Классы и объекты
- •Краткие сведения по теме
- •Использование класса
- •Определение методов класса
- •Общее задание 1. Пример программы
- •Вложенные классы
- •Задания
- •Индивидуально задание 1: Структура-пара
- •Индивидуально задание 2: Структуры и классы
- •Требования к отчетам по лабораторной работе №4
- •Общее задание для проведения лабораторной работы:
- •Сведения по теме
- •Перегрузка операций
- •Перегрузка операций внешними функциями
- •Перегрузка операций методами класса
- •Функции-друзья класса
- •Конструкторы и деструктор
- •Конструкторы и параметры
- •Константы в классе
- •Поля-массивы в классе
- •Операция индексирования
- •Статические элементы класса
- •Подсчет объектов класса
- •Индивидуальные задания
- •Задание по теме: Конструкторы и перегрузка операций
- •Задание по теме: Массивы и константы в классе

Основы создания программ в Си |
Page 19 of 58 |
|
|
|
|
DD[0].next();
Library t;
int a = t.function(5): |
|
Library *pt = new Library; |
|
int b = pt->function(5); |
|
Count A[5]; |
// обьявление массива |
for(int i = 0; 1 < 5; i++) |
|
A[i].Display(); |
// вывод элементов массива |
|
|
Определение размера выделяемой объектам памяти (в байтах) выполняется операцией sizeof(имя класса). Методы не занимают место в классе, а фактический размер класса зависит от режима выравнивания. Даже пустой класс занимает некоторое количество памяти. По умолчанию в каждой интегрированной среде установлен собственный режим выравнивания, влияющий на размер класса. Выравнивание по границе байта можно установить с помощью директивы препроцессора
#pragma pack (1)
или
#pragma pack(push, 1)
В этом случае классу требуется наименьший объем памяти.
Конструкция
class имя-класса;
называется объявлением класса. Обычно такое объявление используется в тех случаях, когда один класс зависит от другого, но определение второго класса недоступно. Объекты такого класса объявлять нельзя — сам класс не определен. Разрешается объявлять указатели на объекты такого класса.
Определение методов класса
Методы класса имеют неограниченный доступ ко всем элементам класса независимо ни от порядка объявления элементов класса, ни от спецификаторов доступа. Методы могут определяться как внутри класса, так и вне его. Определение метода внутри класса не отличается от определения обычной функции. Метод, определенный внутри класса, считается по умолчанию встроенной функцией (inline).
Если метод определяется вне класса, то принадлежность метода классу указывается префиксомименем класса. В классе присутствует только прототип. Метод, определенный вне класса, по умолчанию не считается inline-функцией. Методы могут быть перегружены и могут принимать аргументы по умолчанию. Аргументом и/или возвращаемым значением метода может быть объект того же класса, и такие объекты разрешено объявлять внутри метода.

Основы создания программ в Си |
Page 20 of 58 |
Фактически левым аргументом метода является объект, для которого этот метод вызывается, например
time t;
t.settime(12,54);
Метод неявно получает в качестве аргумента указатель на объект, для которого он вызван. Этот указатель обозначается зарезервированным словом this и может использоваться в теле метода. Через него же разумно осуществлять доступ к полям и методам класса в случае неоднозначности (совпадение имен).
this->Summa
Запись *this представляет собой значение текущего объекта. Часто это значение используется для возврата значения определяемого класса.
Методы могут быть перегружены. Перегрузка методов — это одно из проявлений принципа
полиморфизма в C++.
Методы могут быть константными. Константный метод не изменяет значения полей класса. Константный метод объявляется при указании слова const после списка аргументов метода. Константные и неконстантные методы не являются эквивалентными, даже если у них полностью совпадают прототипы (кроме слова const после списка аргументов). Для объекта-константы может быть вызван только константный метод. Для объекта-переменной можно вызывать как константные, так и неконстантные методы.
Для ввода значений нового типа обычно реализуется метод Read(). В простейшем виде выполняется заполнение полей нового класса из стандартного потока ввода cin с клавиатуры. В методе перед вводом каждого значения можно вывести подсказку-приглашение, объясняющую очередность набора. Передаваемые значения обычно проверяются на допустимость.
Для вывода значений нового типа реализуется метод Display(). В самом простом случае он представляет собой вывод из полей нового класса на экран — в стандартный поток cout. Метод вывода обычно реализуется как константный (см. листинг 1.2).
Общее задание 1. Пример программы
Создадим новый консольный проект, по примеру приведенному в начале лабораторной.
Добавим новый класс time, c помощью контекстной команды в Solution Explorer (Add->Class…)
В диалоге бдобавления класса выберем Class C++ (Рис. 4-20).

Основы создания программ в Си |
Page 21 of 58 |
|
|
|
|
Рис. 4-20
Далее в диалоге создания класса введите имя класса в соответствующее поле и завершите работу визарда (Рис. 4-21)
Рис. 4-21
Введите в заголовочном файле и в фале реализации функций класса соответствующий код объявления функций и их реализацию.
Листинг 1.2. Определение методов класса time в заголовочном файле time.h
#include <string>
#include <iostream>
using namespace std;

Основы создания программ в Си |
Page 22 of 58 |
|
|
|
|
#pragma once
class time
{
public: time(void);
public: ~time(void);
void settime(int h, int m, int s = 0) // определение внутри класса
{
_hours = h; _minutes = m; _seconds = s;
} |
|
|
void settime(const time &t); |
//метод перегружен |
|
time nexthour(); |
//возврат определяемого типа |
|
time addhours(const time &t); |
//параметр определяемого типа |
|
void Display() const; |
//вывод - константный метод |
|
void time::Read(); |
// |
ввод полей |
std::string time::toString(); |
|
|
private: |
// |
закрытые поля |
int _hours, _minutes, _seconds; |
|
|
};
Листинг 1.2.1. Реализация функций класса time (в time.cpp)
#include "StdAfx.h" #include <string> #include <iostream> using namespace std; #include "time.h"
time::time(void)
{
}
time::~time(void)
{
}
void time::Display() const // определение вне класса
// константного метода
{ cout << _hours << "." << _minutes << "." << _seconds; }

Основы создания программ в Си |
Page 23 of 58 |
|
|
|
|
void time :: Read() |
// ввод полей |
|
|
{ |
|
|
|
h: |
|
cout << "Hours : "; |
|
cin >> _hours; |
|
if (_hours > 23) |
// простая проверка |
goto h; |
|
cout << "Minutes: "; |
|
cin >> _minutes; |
// без проверки |
_seconds =0; |
//не вводится |
} |
|
void time::settime(const time &t) |
// определение вне класса |
{ |
|
_hours = t._hours; |
|
_minutes = t._minutes; |
|
_seconds = t._seconds; |
|
} |
|
time time::addhours(const time &t) |
// параметр определяемого типа |
{ |
|
time r = *this; |
// использование this |
r._hours += t._hours; |
|
r._hours%=24; |
|
return r; |
// возврат определяемого типа |
} |
|
time time::nexthour() |
|
{ |
|
_hours++; |
|
_hours%=24; |
|
return *this; |
// возврат текущего объекта |
} |
|
|
|
Полезным является метод преобразования полей класса в строку toString() для последующего использования этой строки в других методах, например для вывода. Для работы со строками необходимо подключить стандартный заголовочный файл
#include <string>
Для показанного выше класса time самая скромная реализация может выглядеть следующим образом:
std::string time::toString()
{

Основы создания программ в Си |
|
Page 24 of 58 |
|||
|
|
|
|
|
|
|
std::string s = ""; |
|
// строка-результат |
|
|
|
std::string Digits = "0123456789"; |
// цифры для результата unsigned |
|
||
|
char dl,d2; |
|
// выделенная цифра |
|
|
|
|
|
|
|
|
|
// формируем часы в строку |
|
|
|
|
|
dl = _hours/10; |
|
|
|
|
|
d2 = _hours%10; |
// получаем цифры часов |
|
||
|
s=s+Digits[dl]; |
|
// прицепляем старшую цифру |
|
|
|
s=s+Digits[d2]; |
|
// прицепляем младшую цифру |
|
|
|
s+=":"; |
|
// завершение подстроки |
|
|
|
// формируем минуты в строку |
|
|
|
|
|
dl = _minutes/10; |
|
|
|
|
|
d2 = _minutes%10; |
// вычисляем цифры минут |
|
||
|
s=s+Digits[dl]; |
|
|
|
|
|
s=s+Digits[d2]; |
|
|
|
|
|
s+=":"; |
|
|
|
|
|
// формируем секунды в строку |
|
|
|
|
|
dl = _seconds/10; |
|
|
|
|
|
d2 = _seconds%10; |
// получаем цифры секунд |
|
||
|
s=s+Digits[dl]; |
|
|
|
|
|
s=s+Digits[d2]; |
|
|
|
|
|
return s; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
Метод возвращает текущее значение полей класса time в виде строки «чч.мм.сс».
В главной функции mail используйте объявленный класс:
Листинг 1.2.2. Реализация главной функции main
#include "stdafx.h" #include "conio.h"
#include "time.h" // подключаем файл загововка класса time
#define NEW_LINE cout << "\n"
int _tmain(int argc, _TCHAR* argv[])
{
time t;
cout << "Time of t is: \n"; t.settime(12,54); //устанавливаем время t t.Display();
NEW_LINE;
cout << "Set t2 value : \n"; time t2;