Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Ключевое слово this

При вызове функции-члена класса передается еще один неявный параметр – указатель на объект класса, который вызывает данную функцию. Этот указатель называется this. Это ключевое слово, в частности, используется при перегрузке операций. В общем случае функции-члены класса могут иметь доступ к приватным элементам класса. Например

class c1{

int i;

….

};

Для данного класса функция – член класса может иметь оператор присваивания i=10; В действительности этот оператор является короткой записью оператора

this->i=10; Чтобы понять как работает оператор this рассмотрим короткую программу

#include <iostream.h>

сlass c1{

int i;

public:

void load_i(int val) { this->i=val;} // аналогично i=val

int get_i(void) { return this->i; } // аналогично return I;

};

void main(void)

{

c1 c;

c.load_i(100);

cout<<c.get_(i);

}

На экран программа выводит число 100.

Рассмотрим дополнительно программу, содержащие перегрузку операции !

#include <string.h>

#include <stdio.h>

const int MAX_LEN = 100;

class Name

{

char data[MAX_LEN];

public:

Name();

void SetData(char *newData);

int operator!();

};

// конструктор – инициализация нулями

Name::Name()

{

memset (data, ‘\0’ , sizeof(data) );

}

// сохранить специфицированное имя

void Name::SetData(char *newData)

{

strcpy(data, newData);

}

// перегрузка операции !() показывает , имеются ли данные

int Name::operator!()

{

return (data[0] = = ‘\0’)

}

void main(void)

{

Name name;

if(!name) // неявный вызов operator !()

name.SetData(“ Тестирование программы”);

// теперь явный вызов функции operator!()

if(!name.operator!())

printf(“Данные присвоены ….\n”);

}

Перегрузка операций ввода/вывода. Инсерторы и экстракторы

Для организации ввода/вывода данных, связанных с классом, строится специальная функция – член класса, целью которой является ввод и вывод данных этого класса. Достигается это путем перегрузки операций >> и <<.

Операция << в англоязычной литературе обычно называется inserting (вставка данных в поток), а операция >> - extracting (извлечение данных из потока).

Функции – члены класса, обеспечивающие перегрузку операций <<, мы будем называть инсертором (insertor), а функцию, соответствующую перегрузке операции >>. Будем называть экстрактором (extractor). В качестве примера создания функции инсертора рассмотрим класс vector:

class vector{

public:

int x, y, z;

vector (int a, int b, int c) { x=a; y=b; z=c;}

}

Чтобы создать функцию-инсертор для этого класса, мы должны определить операцию ввода относительно этого класса, т. е. перегрузить операцию <<.

// vector инсертор

ostream &operator <<(ostream &stream, vector obj)

{

stream << obj.x<<”, “;

stream << obj.y<<”, “;

stream <<obj.z<<”\n”;

return stream:

}

Возвращаемый тип этой функции – ostream. Это необходимое условие для того, чтобы можно было использовать инсертор этого типа в одном потоке вывода.

Функция имеет два параметра: ссылку на поток, который находится слева от знака операции <<, и объект, который находится справа от знака операции, данные этого объекта и будут выводиться.

Затем следует выдача трех значений членов объектов класса vector и возвращается поток stream. Возвращение потока обязательно.

Пример работы инсертора:

#include <iostream.h>

class vector{

public:

int x, y, z;

vector (int a, int b, int c) { x=a; y=b; z=c;}

}

// vector инсертор

ostream &operator <<(ostream &stream, vector obj)

{

stream << obj.x<<”, “;

stream << obj.y<<”, “;

stream <<obj.z<<”\n”;

return stream:

}