Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++_навч_пос14_new.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.86 Mб
Скачать

3.24 Шаблони функцій (1)

#include <iostream.h>

//шаблон функції sum

template <typename T>//список шаблонних параметрів

T sum(T a, T b)

{return a+b;};

void main()

{

int x1=2, x2=3;

cout<<sum(x1,x2)<<endl;//спеціалізація функції sum (T є int)

double y1=2.1, y2=3.5;

cout<<sum(y1,y2)<<endl;//спеціалізація функції sum (T є double)

cout<<sum<int>(4,6);//явна спеціалізація функції sum (T є int)

}

3.25 Шаблони функцій (2)

#include <iostream.h>

//шаблон функції sum

template <typename T>

T sum(T a, T b)

{cout<<"I-"; return a+b;};

//явна спеціалізація шаблонної функції sum

template <>

int sum<int>(int a, int b)

{cout<<"II-"; return a+b;};

//перевантаження шаблонної функції sum

template <typename T>

T sum(T a)

{cout<<"III-"; return a+a;};

bool sum(bool a, bool b)//перевантаження функції sum

{cout<<"IV-"; return a+b;};

void main()

{

double y1=2.1, y2=3.5;

cout<<sum(y1,y2)<<endl;//результат: I-5.6

int x1=2, x2=3;

cout<<sum(x1,x2)<<endl;//результат: II-5

cout<<sum(2)<<endl;//результат: III-4

bool b1=true, b2=false;

cout<<sum(b1,b2)<<endl;//результат: IV-1

}

3.26 Шаблони класів

#include <iostream.h>

//шаблон класу A

template <typename T=int>//список шаблонних параметрів

class A

{

T a;//поле a типу T

public:

A(T ia):a(ia){};

void print();

};

//шаблон методу print шаблонного класу A

template <typename T>

void A<T>::print()

{cout<<a<<endl;}

void main()

{

A<> obj(2);//створити об’єкт класу A<int>

obj.print();

A<double> obj2(2.1);//створити об’єкт класу A<double>

obj2.print();

}

3.27 Шаблони класів і віртуальні методи

#include <iostream.h>

//шаблон класу A

template <class T>

class A

{

protected:

T a;//поле a типу T

public:

A(T ia):a(ia){};//конструктор

//віртуальний метод sum для динамічного поліморфізму

virtual int sum() //спробуйте без слова virtual

{return a;}

void print()

{cout<<sum()<<endl;}

};

//шаблон класу B, успадкований від шаблону класу A

template <class T>

class B: public A<T>

{

protected:

T b;//поле b типу T

public:

B(T ia, T ib):A<T>(ia),b(ib){};//конструктор

int sum()//віртуальний метод

{return a+b;}

};

void main()

{

B<int> obj(2,3);//створення об’єкту класу B<int>

//у методі print буде викликаний метод sum класу B,

//а не A, оскільки sum - віртуальний

obj.print();

}

3.28 Застосування флагів форматування при потоковому вводу-виводі

#include <iostream.h>//бібліотека потокового вводу-виводу

void main()

{

//установити флагі: шістнадцятковий, показувати основу системи числення

cout.flags(ios::hex|ios::showbase);

cout<<16<<endl;

//зняти флаг: шістнадцятковий

cout.unsetf(ios::showbase);

cout<<16<<endl;

//зняти установлені флагі

cout.unsetf(cout.flags());

cout<<16<<endl;

//установити флагі: науковий, показувати основу системи числення

cout.setf(ios::scientific|ios::showpos);

cout.precision(5);//установити кількість цифр після крапки

cout.width(20);//установити ширину поля виводу

cout.fill('*');//установити символ-заповнювач

cout<<135.59017605<<endl;

}

3.29 Установка флагів за допомогою функцій-маніпуляторів

#include <iostream.h>//бібліотека потокового вводу-виводу

#include <iomanip.h>//бібліотека маніпуляторів

void main()

{

cout<<hex<<showbase<<16<<endl;//шістнадцятковий, показувати основу

cout.unsetf(cout.flags());//зняти установлені флагі

cout<<showpoint<<16.0<<endl;//виводити десяткову крапку

cout<<noshowpoint<<16.0<<endl;//не виводити десяткову крапку

cout.unsetf(cout.flags());//зняти установлені флагі

cout<<setprecision(2)<<1.0541<<endl;//виводити 2 знаки після крапки

}