Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программированиние в Ф И.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
352.77 Кб
Скачать

11. Дружественные функции. Указатель this

Можно разрешить элементам другого класса (anotherClass) полный доступ к элементам вашего класса (myClass), объявленным как private или protected, включив в определение вашего класса описание friend:

class myClass{

friend anotherClass;

...

};

Также можно обычной функции или функции-члену другого класса разрешить полный доступ к элементам класса, объявленным как private или protected, с помощью описания friend в вашем определении класса:

class myClass{

friend void anotherClass::Func(int);

friend char* FName(double);

...

};

Указатель this – это неявный параметр функции-члена класса, это указатель на объект, который вызывает функцию. У функций, объявленных вне класса this отсутствует. Так как функции-элементы могут обращаться ко всем элементам класса просто по имени, в основном указатель this используется для возврата указателя на подразумеваемый объект (return this) или возврата самого объекта (return *this). Например:

class A{

int x,y;

public:

A(int xx,int yy){x=xx; y=yy;}

A Even(){if(x%2) x++; return *this;}

};

Задание 7.

. Какая информация появится на экране дисплея после выполнения данной программы:

#include <conio.h>

#include <iostream.h>

class A{

int x,y;

public:

A(int xx=0, int yy=0){x=xx; y=yy;}

A Even();

void GetA(){cout<<"x="<<x<<" y="<<y<<"\n";}

};

A A::Even()

{ if(x%2) x++;

return *this;

}

Void main()

{A a1(33,55);

a1.GetA();

A a2=a1.Even();

a1.GetA();

a2.GetA();

}

Правильный ответ: x=33 y=55

x=34 y=55

x=34 y=55

12. Перегрузка операций

Большинству операций языка С++ может быть придано специальное значение относительно вновь определенных классов. Для встроенных типов данных значение операции изменить нельзя. Просто вводится новая операция относительно нового конкретного класса. Чтобы перегрузить операцию, надо определить, что эта операция значит относительно класса, к которому она будет применяться. Для этого создается специальная функция операции (operator function),которая определяет действие этой операции. Основная форма функции-операции, являющейся членом класса:

тип имя_класса :: operator знак операции (список аргументов)

{

... //тело функции

}

Здесь тип – это тип возвращаемого значения. Обычно тип возвращаемого значения – класс, хотя возможен и другой тип. Функция-операция должна быть или членом класса или дружественной функцией. Рассмотрим на примере программы, как реализуется перегрузка операций ” +” и ” =” относительно класса vector, который определяет трехмерный вектор:

#include <iostream.h>

class Vector{

int x,y,z;

public:

Vector operator+(Vector t);

Vector operator=(Vector t);

void Show();

void Ass(int mx,int my,int mz);

};

Vector Vector::operator+(Vector t) // перегрузка операции “+”

{ Vector tmp;

tmp.x=x+t.x; tmp.y=y+t.y; tmp.z=z+t.z;

return tmp;

}

Vector Vector::operator=(Vector t) // перегрузка операции “ =”

{ x=t.x; y=t.y; z=t.z;

return *this; // использование указателя this

}

void Vector::Show()

{cout<<x<<" "<<y<<" "<<z<<"\n";}

void Vector::Ass(int mx,int my,int mz)

{x=mx;y=my;z=mz;}

void main()

{ Vector a,b,c;

a.Ass(1,2,3);

b.Ass(10,10,10);

a.Show();

b.Show();

c=a+b; // операции “+ “и “=”, т. е. c.operator=(a.operator+(b))

c.Show();

}

В этом примере выражение a+b означает вызов из объекта a функции-оператора operator+(b), аргументом которой является объект b. Полученный результат в свою очередь является аргументом функции-оператора operator=(a.operator+(b)), которая вызывается из объекта c.

Если используются функции- операторы как члены классов, то не нужны параметры для унарных операций и требуется лишь один параметр для бинарных операций. Во всех случаях объект, активизирующий операцию, передается в функцию операцию неявно через указатель this.

Задание 8.

. Какая информация появится на экране дисплея после выполнения данной программы:

#include <iostream.h>

class Vector{

int x,y,z;

public:

Vector operator+(Vector t);

Vector operator=(Vector t);

void Show();

void Ass(int mx,int my,int mz);

};

Vector Vector::operator+(Vector t)

{ Vector tmp;

tmp.x=x+t.x; tmp.y=y+t.y; tmp.z=z+t.z;

return tmp;

}

Vector Vector::operator=(Vector t)

{ x=t.x; y=t.y; z=t.z;

return *this;

}

void Vector::Show()

{cout<<x<<" "<<y<<" "<<z<<"\n";}

void Vector::Ass(int mx,int my,int mz)

{x=mx;y=my;z=mz;}

void main()

{ Vector a,b,c;

a.Ass(1,2,3);

b.Ass(10,10,10);

a.Show();

b.Show();

c=a+b;

c.Show();

c=a+b+c;

c.Show();

c=b=a;

c.Show();

b.Show();

}

Правильный ответ: 1 2 3

10 10 10

11 12 13

22 24 26

1 2 3

1 2 3.

13. Работа с файлами в языке С++.

Чтобы работать с файлами в программе на языке С++, необходимо подключить стандартную библиотеку <fstream.h>. Класс fstream является потомком классов istream

и ostream. Эти же классы являются родителями классов ifstream и ofstream. Класс fstream используется для ввода-вывода в один и тот же файл. Классы ifstream и ofstream – соответственно для ввода (чтения) файла и вывода (записи в файл). Экземплярами классов

istream и ostream являются cin, cout, cerr, с помощью которых реализуется ввод со стандартного вводного устройства (клавиатура) и вывод на стандартное выводное устройство (экран). Файловый ввод-вывод выполняется с помощью операций записи в файл << и чтения файлов >>, переопределенных в поточных классах. Для работы с файлом, его сначала следует открыть, т.е. связать со стандартной структурой, в которой заданы характеристики файла. Эта связь реализуется функцией open(), входящей в класс, который определяет ввод-.вывод (fstream, ifstream, ofstream). Чтобы получить доступ к этой функции, сначала необходимо создать объект соответствующего класса. Например, чтобы выполнить вывод в файл нужно создать объект класса ofstream (например: ofstream Sub;), после чего выполнить Sub.open(). Соответственно для чтения файла нужно создать объект класса ifstream (например: ifstream Bart), после чего выполнить Bart.open(). В скобках необходимо указать имя открываемого файла. Если файл для записи заранее не существует, его можно создать и открыть двумя способами – либо при объявлении объекта класса ofstream (например ofstream Sub(“new.txt”); ), либо с использованием функции open() (например Sub.open(“new.txt”);). После того как файл открыт для чтения или записи, используют операции записи в файл << и чтения файлов >>. Для того, чтобы записать в наш файл (new.txt) строку текста и две переменные int k и float f , можно записать

Sub << “Hi, friends!” << k << f << endl; ,

где endl – конец вывода и переход на новую строку. Когда работа с файлом закончена, файл следует закрыть, чтобы разорвать связь со структурой, с которой файл связывался при его открытии. Это выполняется с помощью функции close() того же объекта, который создавался, чтобы выполнить функцию open() (в нашем примере Sub.close()).

Кроме функций open() и close() классы ifstream и ofstream обладают рядом других методов.

В классе ofstream, предназначенном для записи в файл, наиболее широко используемыми методами являются:

is_open() -- возвращает TRUE, если файл открыт, и FALSE в противном случае;

put() – записывает в файл один символ;

write() -- записывает в файл заданное число символов.

В классе ifstream, предназначенном для чтения из файла, наиболее широко используемыми методами являются:

is_open() -- возвращает TRUE, если файл открыт, и FALSE в противном случае;

get() – читает из файла один символ;

read() -- читает из файла заданное число символов.

eof() – возвращает ненулевое значение, когда указатель позиционирования в файле

достигает конца файла.

Следующий пример иллюстрирует работу с классами ifstream и ofstream. В данном примере создаются два файла - один (new.txt) для записи текстовой информации, другой - (numbers.txt) для записи числовой информации. После чего, производится запись в файлы соответствующих данных, и файлы закрываются. Далее файлы открываются для чтения, считывается информация (чтение текстовой информации производится по словам), эта информация выводится на экран, и файлы закрываются.

#include <iostream.h>

#include <fstream.h>

void main()

{ofstream Outfile("new.txt");

if(!Outfile) cout<<"Can't open file. \n";

Outfile<<"Hello friends!";

Outfile.close();

ofstream file;

file.open("numbers.txt");//Outfile.open("numbers.txt");

file<<15<<" "<<42<<" "<<1;//Outfile<<15<<" "<<42<<" "<<1;

file.close();//Outfile.close();

ifstream Infile;

Infile.open("new.txt");

char p[50];

Infile>>p;

cout<<p<<"\n";

Infile>>p;

cout<<p<<"\n";

Infile.close();

int Num;

Infile.open("numbers.txt");

while(!Infile.eof())

{Infile>>Num; if(!Infile.eof())cout<<Num<<"\n";};

Infile.close();

Infile.open("new.txt");

while(!Infile.eof()){Infile>>p; cout<<p<<"\n";};

}

43