Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать
  1. Определение переменных указателей. Инициализация указателей.

Указатель — это переменная специального типа. Она хранит не какое-то числовое значение, а адрес (номер первого байта в памяти компьютера), по которому хранится какая-то другая переменная. При создании указателя необходимо задать тип переменной, на которую он указывает. Синтаксис объявления указателя такой:

имя_типа * идентификатор;

Пример:

int * pi;

float * pf, f;

double * ps, * pt;

В первой строке этого примера объявлены переменная pi, являющейся указателем на тип int (то есть в ячейке памяти, на которую указывает pi должна хранится переменная типа int). Во второй строке объявлены переменная pf, являющейся указателем на тип float и переменная f типа float. Обратите особое внимание на эту строчку: для того, чтобы объявить несколько указателей в одной строке, необходимо перед идентификатором каждого из них поставить символ *. А еще лучше объявлять в одной строке только одну переменную. В третей строке объявляется два указателя на тип double: ps и pt.

Инициализация указателей.

Прежде чем использовать указатель он должен быть инициализирован адресом переменной.

point_Ch = &Ch; // операция получения адреса и инициализация указателя.

Указатель рекомендуется инициализировать немедленно. В противном случае он должен быть установлен в ноль.

int *point_count = NULL;

Операция получения адреса самого указателя.

Пример:

char *point_Ch;

printf("Адрес переменной point_Ch = %08X\n",&point_Ch);

  1. Организация списка объектов различного типа. Техническая реализация

виртуальных функций.

Виртуальный метод (виртуальная функция) — в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.

Виртуальные методы — один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет способ работы с объектами и любые его наследники могут предоставлять конкретную реализацию этого способа. Если в родительском классе некоторая функция объявлена как виртуальная, то в производном классе ее можно переопределить. В этом, собственно говоря, ничего нового нет – этомы могли делать и без всяких виртуальных функций. Новое заключается в том, что если мы запишем в переменную типа родительского класса экземпляр проиводного, то для такого экземпляра мы сможем вызывать переопределенную функцию производного класса. Вот пример, поясняющий это:

{ class Worker

{ protected int age=0;

virtual public void setAge(int age)

{

if(age>0 && age<100)

this.age=age;

else

this.age=0;

}

public int getAge()

{ return age; } }

//Класс Boss

class Boss : Worker

{ public int numOfWorkers; //Количество подчиненных

override public void setAge(int age)

{ if(age>0 && age<45)

this.age=age;

else

this.age=0;} }

class Test

{ static void Main(string[] args)

{ Worker boss = new Boss();

boss.setAge(50);

Console.WriteLine("Возраст босса "+boss.getAge());

} }}

Как вы видите, тут функцию setAge в родительском классе Worker мы определили с ключевым словом virtual, а одноименную функцию в производном классе Boss – с ключевым словом ovеrride.

Обратите внимание на то, что из какого конкретно класса вызывается функция (из родительского или производного) определяется на этапе выполнения программы, а не на этапе компиляции. В принципе в переменную родительского типа мы могли бы записать экземпляр именно родительского класса.

Для организации списка каких-либо объектов мы используем шаблоны.

например

template <class T> class SpisokChegoLibo;

template <class Type>

class SpisokChegoLibo {

public:

SpisokChegoLibo() ;//конструктор

~SpisokChegoLibo();//деструктор

private:

T data;

SpisokChegoLibo<Type> *front;

SpisokChegoLibo<Type> *back;

//в зависмости от того какой именно список мы создаем.

};

В зависимости от случая поля могут изменяться.

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