Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1207

.pdf
Скачиваний:
2
Добавлен:
08.01.2021
Размер:
271.62 Кб
Скачать

21

Лабораторная работа 7.

Статические члены класса

Переменные и члены класса, объявленные с модификатором доступа static, называются статическими членами класса. Cтатические переменные и методы доступны без создания объекта данного класса. Имя статической переменной квалифицируется именем класса с использованием операции принадлежности :: , а не именем экземпляра класса.

Например:

class A { public: static int iStat; }; int main(int argc, char* argv[]) {

A:: iStat = 123;

}

class A { public:

static int iStatVar; };

int main(int argc, char* argv[]){ int A:: iStatVar = 0;

int *piStatVar = &A:: iStatVar;

}

class a1 {public:

a1(void);

~a1(void);

int Fx1(int i1); int Fx2(int i2);

protected:

static int Fstat1(void);

// Статическая функция доступна //только для статических методов - членов //данного класса и наследуемых классов

public:

static int Fstat2(void);

// Общедоступная статическая функция

};

int main(int argc, char* argv[]){ std::cout<<a1::Fstat2();

// Вызов статической функции

}

22

Лабораторная работа 8.

В следующем примере иллюстрируется вызов виртуальных методов:

class A

// Объявление базового класса

{ public:

 

virtual void VirtMetod1(); // Виртуальный метод

void Metod2();

// Не виртуальный метод

};

void A::VirtMetod1() { cout << "Вызван A::VirtMetod1\n";}

void A::Metod2() { cout << "Вызван A::Metod2\n"; }

class B : public A

// Объявление производного класса

{public:

 

 

void VirtMetod1();

// Виртуальный метод

void Metod2();

// Не виртуальный метод

};

 

 

void B::VirtMetod1() { cout << "B::VirtMetod1\n";}

void B::Metod2() { cout << "B::Metod2\n"; }

void main() {

 

B aB;

// Объект класса B

B *pB = &aB;

// Указатель на объект класса B

A *pA

= &aB;

// Указатель на объект класса A

pA->VirtMetod1();

// Вызов метода VirtMetod класса B

pB->VirtMetod1();

// Вызов метода VirtMetod класса B

pA->Metod2();

// Вызов метода Metod2 класса A

pB->Metod2();

// Вызов метода Metod2 класса B

}

Пример 12.1. Вызов виртуальных методов

Результатом выполнения этой программы будут следующие строки:

Вызван A::VirtMetod1 Вызван B::VirtMetod1

Вызван A::Metod2 Вызван B::Metod2

Чисто виртуальной функцией называется виртуальная функция, указанная с инициализатором

=0.

Например:

virtual void F1( int) =0;

Объявление класса может содержать виртуальный деструктор, используемый для удаления объекта определенного типа. Однако

23

виртуального конструктора в языке С++ не существует. Некоторой альтернативой, позволяющей создавать объекты заданного типа, могут служить виртуальные методы, в которых выполняется вызов конструктора для создания объекта данного класса.

Например: class A{ public:

A();

A (const A&);

virtual A* virt_object1 () { return new A();

}

virtual A* virt_object2 () { return new A(*this);

}

}

24

Лабораторная работа 9.

Шаблон метода указывается ключевым словом template, за которым в угловых скобках указывается список типов, используемых для параметров функции и типа возвращаемого значения.

Например: template <class T1>

T1 Fx (T1 x, T1 y) {return x+y;}

При использовании шаблона компилятор заменит для вызываемого метода тип шаблона на тип, указанный при вызове метода ( T1 на int в следующем примере).

Например: int i1=1; int i2=2;

std::cout<<Fx(i1,i2);

Для создания объекта на основе шаблона класса после имени шаблона в угловых скобках указывается конкретный тип:

имя_шаблона_класса <тип> имя_объекта.

Например:

template <class T1> // Описание шаблона класса class A

{

T1 x,y; public:

A();

~A(); T1 Fx();

void Fy(T1 a, T1 b);

};

template <class T1> A< T1>::A() {} // Реализация методов шаблона класса

template <class T1> A< T1>::~A() {}

template <class T1>T1 A< T1>::Fx(){ return x*y;}

template <class T1>void A< T1>::Fy(T1 a, T1 b) {x=a; y=b;}

int main(int argc, char* argv[]) { int i1=1;

int i2=2; double x=1.5; double y=2.5;

 

25

A <int> F1;

// Создание объекта с использованием шаблона класса

A <int> *pF1=&F1; // Указатель на объект параметризированного

типа

pF1->Fy(i1,i2); std::cout<<pF1->Fx()<<std::endl; A <double> F2;

A <double> *pF2=&F2; pF2->Fy(x,y); std::cout<<pF2->Fx()<<std::endl;

return 0;

}

26

Лабораторная работа 10.

Работа с памятью

Свободная память, которую можно заказывать в процессе выполнения программы, называется динамической памятью. Для выделения непрерывного блока памяти можно использовать функцию malloc(), а для освобождения - функцию free(). Прототипы этих функций расположены в заголовочном файле stdlib.h.

Например:

int *pIntBuffer;

// Выделение памяти под 5 переменных типа int pIntBuffer=malloc(5*sizeof(int));

При отсутствии требуемого количества памяти функция malloc возвращает значение null.

Выделение динамической памяти также можно выполнять оператором new, а освобождение - оператором delete. Оператор new автоматически учитывает тип объекта и выделяет требуемое количество памяти.

Пример:

double *pBuffer;

// Выделение памяти под 10 переменных типа double pBuffer=new double [10];

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]