Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_ООП.docx
Скачиваний:
5
Добавлен:
18.09.2019
Размер:
114.62 Кб
Скачать

18. Указатель this

Каждый объект содержит свой экземпляр полей класса. Методы места в классе не занимают и не дублируются для каждого объекта. Единственный экземпляр метода используется всеми объектами совместно, поэтому нестатический метод должен "знать", для какого объекта он вызван.

Каждый нестатический метод, помимо явно объявленных параметров, получает еще один скрытый параметр: константный указатель на объект, для которого он вызван. В С++ это указатель обозначается зарезервированным словом this. Когда имя параметра метода совпадает с именем поля класса, доступ к полю выполняется через этот указатель (например, this -> num).

Выражение *this представляет собой разыменование указателя и имеет тип определяемого класса. Обычно это выражение возвращается в качестве результата, если метод возвращает ссылку на свой класс (return *this;).

19. Статические члены: функции и данные.

Члены объявленные с атрибутом static являются общими для всех объектов класса. Статические методы могут использовать только статические члены класса. К статическим членам можно обращаться через имя класса операцией расширения видимости (аналогично области имен) или как к обычным членам через объект класса.

class MyClass{

public:

static int n;

static int addn(int arg){

return n+arg;}

};

// инициализация статического члена данных

int MyClass::n=30;

int main() {

// обращение к статическим членам

// через имя класса

MyClass::n=3;

cout<<MyClass::addn(2)<<endl;

// обращение к статическим членам

// через объект

MyClass cls;

cls.n=5;

cout<<cls.addn(2)<<endl;

return 0;

}

20. Указатели на члены.

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

class cl {. . .

public:

int f (char*, int);

void g();

. . .

};

/* Как и для указателя на обычную функцию, при объявлении указателя на компонентную функцию необходимо объявить типы результата и аргументов функции, на которую заводиться указатель. Как обычно, указатель можно инициализировать при объявлении: */

int (cl ::*fptr) (char *, int) = cl::f;

Пример:

struct s {int mem;

s (int a){mem=a;}

void func(int a){cout< };

void main(){

void (s::*fp)(int) = s::func;

s obj(5);

s *p = &obj;

// Два варианта вызова функции-члена по указателю -

(obj.*fp)(6); // используя объект obj типа s

(p->*fp)(9); // и указатель p на него.

}

21. Структуры и объединения

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

Можно присваивать одну структуру другой, если они имеют одинаковый тип.

Объявление структуры задает имя структурного типа и/или последовательность объявлений переменных, называемых элементами структуры. Эти элементы могут иметь различные типы. struct [<тег>] {<список объявлений элементов>} <описатель> [, <описатель> ...]; struct  <тег>   <описатель> [, <описатель> ...];

Список объявлений элементов представляет собой последовательность из одного или более объявлений переменных. Каждая переменная, объявленная в этом списке, называется элементом структуры. Особенность синтаксиса объявлений элементов структуры состоит в том, что они не могут содержать спецификаций класса памяти и инициализаторов. Элементы структуры могут иметь базовый тип, либо быть массивом, указателем, объединением или структурой.

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

union [<тег>] {<список объявлений элементов>} <описатель> [, <описатель> ...]; union  <тег>   <описатель> [, <описатель> ...];

Память, которая выделяется переменной типа объединение, определяется размером наиболее длинного элемента объединения. Все элементы объединения размещаются в одной и той же области памяти с одного и того же адреса. Значение текущего элемента объединения теряется, когда другому элементу объединения присваивается значение.

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