Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Давайте профилируем немного изменённую программу DeepCopy из главы 18, "Копирующий конструктор".
//
/* DeepCopy — программа для демонстрации профилирования */
//
#include
#include
#include
#include
using namespace std ;
class Person
{
public :
Person( char *pN )
{
pName = new char[ strlen( pN ) + 1 ] ;
if ( pName != 0 )
{
strcpy( pName , pN ) ;
}
}
Person( Person & p )
{
pName = new char[ strlen( p.pName ) + 1 ] ;
if ( pName != 0 )
{
strcpy( pName , p.pName ) ;
}
}
~Person( )
{
delete pName ;
pName = 0 ;
}
protected :
char *pName ;
} ;
_________________
340 стр. Часть 6. Великолепная десятка
void fn1( Person & p )
{
/* Создаём новый объект */
Person p1( p ) ;
}
void fn2( Person p )
{
/* Создаём новый объект */
Person* p1 = new Person( p ) ;
delete p1 ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
Person p( "Very, very long name" ) ;
for ( int i = 0 ; i < 10000000 ; i++ )
{
fn1( p ) ;
fn2( p ) ;
}
return 0 ;
}
Эта программа вызывает функции fn1( ) и fn2( ) десять миллионов раз — просто нереально получить сколь-нибудь точную картину происходящего, если программа выполняется меньше секунды.
Кроме того, я удалил из программы весь вывод на экран. Если вы вернёте его назад, то сразу убедитесь, что это очень медленный процесс, так что время, затраченное на вывод на экран, не даст возможности получить результаты по другим функциям.
После выполнения программы воспользуйтесь командой меню Выполнить => Анализ профиля( Execute => Profile Analysis). Появляющееся при этом окно показано на рис. 30.1.
Рис. 30.1. Анализ профиля программы
_________________
341 стр. Глава 30. Десять основных возможностей Dev-C++
Интерпретация профиля требует определённой практики. В окне показаны функции, вызываемые в процессе выполнения программы ( в программе могут быть и другие функции, которые никогда не вызываются ). В первом столбце перечислены имена функций, за которыми следуют время их работы в процентах от общего времени работы программы. В нашем случае больше всего времени занимает выполнение конструктора копирования. В столбце Self Sees указано общее время, затраченное на выполнение этой функции.
Означает ли приведённая информация, что конструктор копирования — самая медленная функция программы? Не обязательно. Просто программа вызывает эту функцию чаще других — и в функции fn1( ) , и в fn2( ) .
Опустившись ниже по списку, мы видим, что fn2( ) работает почти в два раза больше, чем fn1( ) . В основном это связано с тем, что функция main( ) передаёт функции fn2( ) объект Person по значению, что приводит к дополнительному вызову конструктора копирования.
_________________
342 стр. Часть 6. Великолепная десятка
Глава 31. ПРОГРАММА BUDGET...343
ОГЛАВЛЕНИЕ
В этой главе...
►BUDGET1 343
►BUDGET2 348
►BUDGET3 355
►BUDGET4 366
►BUDGET5 377
В этой дополнительной главе описана серия программ для работы с воображаемым банковским счётом. Первая из них, BUDGET1, решает поставленную задачу с использованием простейших ( и подверженных ошибкам ) технологий функционального программирования. В программе BUDGET2 информация о счетах хранится в двух классах, Savings и Checking . Программа BUDGET3 выражает взаимоотношения классов Savings и Checking путём порождения их из общего класса Account . Объекты в этой программе хранятся в связанном списке. Программа BUDGET4 обобщает связанный список, превращая его в шаблон класса LinkedList< class Т > , а в программе BUDGET5 мы перестаём изобретать велосипед и используем один из контейнеров STL. Все исходные тексты программ находятся на прилагаемом компакт-диске.
►BUDGET1...343
Главы, составляющие две первые части книги, предоставляют вам достаточно информации для написания собственной нетривиальной программы. Такой программой является рассматриваемая далее программа BUDGET 1.
В этой программе используются концепции С++, рассмотренные в первых двух частях книги. Программа BUDGET моделирует простейший банковский счёт ( в очень упрощённом виде ). Эта программа будет выполнять такие действия:
■■■
■ создавать один или несколько банковских счетов;
■ присваивать уникальный номер каждому счёту;
■ работать со счётом — создание депозита и снятие денег;
■ выводить окончательный баланс всех счетов, после того как пользователь решит выйти из программы.
■■■
Программа имитирует банковские транзакции, подчиняющиеся следующим правилам ( в процессе развития программы к этим правилам будут добавлены и другие ).
■■■
■ Баланс не может быть отрицательным ( каким бы дружественным не был к вам ваш банк, настолько дружественным он быть просто не в состоянии ).
■ Создание депозита не влечёт за собой никаких расходов.
■■■
_________________
343 стр. Глава 31. Программа BUDGET
Вот как выглядит исходный текст данной программы.
/* BUDGET1.CPP — "Функциональная" программа бюджета */
#include
#include
#include
using namespace std ;
/* Максимальное количество счетов */
const int maxAccounts = 10 ;
/* Данные, описывающие счёт */
unsigned accountNumber[ maxAccounts ] ;
double balance[ maxAccounts ] ;
/* Прототипы функций */
void process( unsigned & accountNumber ,
double & balance ) ;
void init( unsigned* pAccountNumber ,
double* pBalance ) ;
/* main — собирает начальные входные данные и выводит конечные суммы */
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
cout << "Нажмите С для продолжения, X для выхода:\n" ;
// Цикл ввода
int noAccounts = 0 ; /* Количество счетов */
/* Нельзя создать счетов больше, чем выделено места */
cout << "Программа создаёт банковские счета\n" << endl ;
while ( noAccounts < maxAccounts )
{
char transactionType ;
cout << "С для создания счёта, X для выхода: " ;
cin >> transactionType ;
/* Выход, если пользователь ввёл X */
if ( transactionType == 'x' ||
transactionType == 'X' )
{
break ;
}
/* Если введено С */
if ( transactionType == 'c' ||
transactionType == 'C' )
{
/* Инициализация нового счёта */
init( & accountNumber[ noAccounts ] ,
& balance[ noAccounts ] ) ;
/* Ввод информации о транзакции */
process( accountNumber[ noAccounts ] ,
balance[ noAccounts ] ) ;
Читать дальшеИнтервал:
Закладка: