Стефан Дэвис - С++ для чайников .

Тут можно читать онлайн Стефан Дэвис - С++ для чайников . - бесплатно полную версию книги (целиком) без сокращений. Жанр: sci_tech, издательство Издательский дом Вильямс. Компьютерное издательство Диалектика, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    С++ для чайников .
  • Автор:
  • Жанр:
  • Издательство:
    Издательский дом Вильямс. Компьютерное издательство Диалектика
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    0-7645-6852-3, 978-5-8459-0723-3
  • Рейтинг:
    4/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Стефан Дэвис - С++ для чайников . краткое содержание

С++ для чайников . - описание и краткое содержание, автор Стефан Дэвис, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
empty-line
1
empty-line
4

С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)

С++ для чайников . - читать книгу онлайн бесплатно, автор Стефан Дэвис
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

В такой ситуации целочисленные параметры должны быть сначала приведены к типу double ( с потерей точности ). Функция возвращает значение double , которое теперь надо преобразовать к типу int . Функция может работать и без потери точности, но выполнение всех этих преобразований делает её куда более медленной, чем она могла бы быть. Словом, эта функция в любом случае работает не так, как ожидает ( или надеется ) пользователь.

Конечно, функцию maximum( ) можно просто перегрузить.

double maximum( double d1 , double d2 )

{

if ( d > d2 ) return d1 ;

return d2 ;

}

int maximum( int n1 , int n2 )

{

if ( n1 > n2 ) return n1 ;

return n2 ;

}

char maximum( char c1 , char c2 )

{

if ( c1 > c2 ) return c1 ;

return c2 ;

}

/* Определения функции для других типов */

Такой подход вполне работоспособен. Теперь С++ выберет наиболее подходящую функцию, а именно — maximum( int , int ) . Однако создание одной и той же функции для переменных каждого типа требует массу времени.

Исходный код всех функций maximum( Т , Т ) следует одному и тому же шаблону для всех Т , представляющих числовые типы. Было бы удобно, если бы можно было написать функцию один раз и позволить С++ самостоятельно подставлять в неё нужные типы.

►Обобщение функции в шаблон...309

Шаблонная функция позволяет вам написать нечто, выглядящее как обычная функция, но в отличие от обычной, такая функция может использовать один или несколько фиктивных заменителей типов, которые С++ затем преобразует в реальные типы во время компиляции. Вот программа, в которой определяется шаблон обобщённой функции maximum( ) .

/* MaxTemplate — шаблон функции maximum( ), возвращающей */

/* наибольшее значение из двух аргументов */

#include

#include

#include

using namespace std ;

template < class T >

T maximum( T t1 , T t2 )

{

if ( t1 > t2 )

{

return t1 ;

}

return t2 ;

} ;

int main( int argc , char* pArgs[ ] )

{

/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */

setlocale ( LC_ALL , ".1251" ) ;

/* Ищем максимум из двух int */

cout << "Максимум из 1 и 2 равен "

<< maximum( 1 , 2 )

<< endl ;

/* Ищем максимум из двух double */

cout << "Максимум из 1.5 и 2.5 равен "

<< maximum( 1.5 , 2.5 )

<< endl ;

/* Пауза для того, чтобы посмотреть на результат работы программы */

system( "PAUSE" ) ; return 0 ;

}

_________________

309 стр. Глава 27. Шаблоны С++

Обратите внимание на ключевое слово template , за которым следуют угловые скобки — в скобках могут содержаться заменители типов, каждому из которых предшествует слово class , или константы. В нашем случае определение функции maximum( ) использует "неизвестный тип" Т . После угловых скобок идёт обычное определение функции, которая в нашем случае возвращает большее из двух значений типа Т — типа, который будет определён позже в программе.

Шаблон функции бесполезен до тех пор, пока он не преобразуется в реальную функцию, когда С++ заменяет Т ( для обозначения неизвестного типа могут использоваться любые идентификаторы, а не только Т ) реальным типом. В приведённой программе функция main( ) неявно заставляет С++ создать две версии функции maximum( ) .

Создание функции из шаблона называется его настройкой или инстанцированием - фото 327

«Создание функции из шаблона называется его настройкой, или инстанцированием.»

[ Советы ]

Первый вызов maximum( 1 , 2 ) заставляет С++ создать версию функции, в которой Т заменяется на int . Второй вызов создаёт отдельную функцию maximum( double , double ) . В результате вывод программы имеет следующий вид.

Максимум из 1 и 2 равен 2 Максимум из 15 и 25 равен 25 Press any key to - фото 328

Максимум из 1 и 2 равен 2

Максимум из 1.5 и 2.5 равен 2.5

Press any key to continue...

Будьте внимательны с терминологией Шаблон функции не является функцией - фото 329

«Будьте внимательны с терминологией. Шаблон функции не является функцией. Прототип шаблона функции —maximum< T >( Т , Т ) , а функция, которую создаёт данный шаблон при заменеТ наint , —maximum ( int , int ) ( это уже функция, а не шаблон ).»

[ Атас! ]

Заметим, что следующий код всё равно оказывается неработоспособным:

double d = maximum( 1 , 2.0 ) ;

_________________

310 стр. Часть 5. Полезные особенности

Проблема в том, что типы первого и второго аргументов различны, а при инстанцировании типы аргументов должны точно соответствовать объявлению функции. Приведённое же выражение может соответствовать шаблону maximum< T1 , Т2 > ( Т1 , Т2 ) ( тогда С++ заменит Т1 на int , а Т2 на double ) , но не использовавшемуся ранее шаблону с одним аргументом типа.

Вы можете заставить С++ инстанцировать шаблон, использовав в программе объявление требуемой функции:

float maximum( float , float ) ; /* Заставляет С++ */

/* инстанцировать шаблон функции */

/* maximum< T >( Т , Т ) для Т = float */

С даже не пытается компилировать шаблон функции до тех пор пока шаблон не - фото 330

«С++ даже не пытается компилировать шаблон функции до тех пор, пока шаблон не будет преобразован в реальную функцию. Если ваш шаблон содержит ошибки, вероятно, вы не узнаете о них до тех пор, пока не инстанцируете его.»

[ Атас! ]

►Шаблоны классов...311

С++ позволяет программисту определять шаблоны классов. Шаблон класса следует тем же принципам, что и использование обычного класса, с заменой фиктивного неизвестного типа известным на этапе компиляции. Например, в приведённой далее программе создаётся вектор некоторого пользовательского класса ( вектор — это контейнер, в котором объекты хранятся в линейном порядке, так что массив является классическим примером вектора ).

/* TemplateVector — реализация шаблона вектора */

#include

#include

#include

#include

#include

using namespace std ;

/* TemplateVector — простой шаблон массива */

template < class T >

class TemplateVector

{

public :

TemplateVector( int nArraySize )

{

/* Количество элементов массива */

nSize = nArraySize ;

array = new T[ nArraySize ] ;

reset( ) ;

}

int size( ) { return nWriteIndex ; }

void reset( ) { nWriteIndex = 0 ; nReadIndex = 0 ; }

void add( T object )

{

if ( nWriteIndex < nSize )

{

array[ nWriteIndex++ ] = object ;

}

}

T get( )

{

_________________

311 стр. Глава 27. Шаблоны С++

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стефан Дэвис читать все книги автора по порядку

Стефан Дэвис - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




С++ для чайников . отзывы


Отзывы читателей о книге С++ для чайников ., автор: Стефан Дэвис. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x