
- •Часть 1.
- •2. Перечисляемые типы.
- •Int Matrix[5][6];
- •4. Стандартный ввод/вывод в языке с.
- •Void main()
- •Void *pv;
- •7. Оператор безусловного цикла for.
- •Void main()
- •8. Циклы while и do/while
- •9. Условные операторы if и if/else
- •10. Условный оператор switch/case
- •Void main(void)
- •Int sign[10];
- •11. Функции, определяемые пользователем.
- •12. Три способа передачи параметров в функцию
- •Void min(double*, double&);
- •Void min(double mas[10],double &num)
- •13. Массивы и указатели. Указатель на функцию.
- •Void main()
- •Void main()
- •Часть 2.
- •2. Определение класса. Состав класса, создание экземпляров класса.
- •3. Конструктор класса, его назначение.
- •4. Конструктор класса с аргументами, задаваемыми по умолчанию.
- •Int GetX1(){return X;}
- •Int GetX2(){return y;}
- •Int GetX1(){return x1;}
- •Int GetX2(){return x2;}
- •Void main()
- •Void f2();
- •6. Множественное наследование. Виртуальные базовые классы.
- •7. Передача аргументов в базовый класс.
- •9. Виртуальные функции
- •Void main()
- •Virtual void Func(){};
- •Void main()
- •Void SetData(t val);
- •11. Дружественные функции. Указатель this
- •Void main()
- •12. Перегрузка операций
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";};
}