Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4,№5.pdf
Скачиваний:
105
Добавлен:
11.02.2015
Размер:
1.13 Mб
Скачать

Основы создания программ в Си

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;