1207
.pdf21
Лабораторная работа 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];