
Лекция 4
Обработка массивов объектов на языке С++
Язык С++ позволяет создавать и обрабатывать массивы объектов. Решим задачу обработки массива объектов.
Постановка задачи. Описать класс “анкета”, включающий
имя
год рождения
функции инициализации полей класса
функции доступа к полям класса.
В программе предусмотреть создание массива объектов и вывод на экран значений полей этого массива.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define k 3
class ANKETA
{ char name[10];
int year;
public:
void setname(char s[10])
{strcpy(name,s);}
void setyear(int p)
{year=p;}
char *getname()
{return name;}
int getyear()
{ return year;}
}mas[k];//массив объектов
//внешние функции
void input()
{char str[10];
int b;
for(int i=0;i<k;i++)
{
cout<<"\n"<<"input the name of the object "<<i;
gets(str);
mas[i].setname(str);
cout<<"\n"<<"input the year of the object "<<i;
cin>>b;
mas[i].setyear(b);
}}
void output()
{for(int i=0;i<k;i++)
cout<<"\n"<<mas[i].getname()<<" "<<mas[i].getyear();
getch();
}
void main()
{clrscr();
input();
output();
}
Перегрузка конструкторов. Конструктор по умолчанию
Язык С++ позволяет выполнять перегрузку функций. Иначе говоря, в С++ несколько функций могут иметь одинаковые имена., но при условии, что их параметры будут различными. Такую ситуацию называют перегрузкой функций, а функции- перегруженными. Перегруженные функции должны отличаться типами и (или) числом параметров. При обращении к функции компилятор использует то определение функции, количество и тип параметров которого совпадает с количеством и типом аргументов в обращении к функции.
Конструктор, по сути, мало чем отличается от обычной функции, поэтому может быть перегруженным. Следовательно, класс может содержать несколько конструкторов.
Рассмотрим пример создания класса “строка”, который будет содержать два конструктора.
#include<iostream.h>
#include<string.h>
class stroka
{char* ch;//указатель на строку
int len;//длина строки
public:
//первый конструктор создает пустую строку
stroka(int n=80)
{len=0;ch=new char[n+1];
ch[0]='\0';
}
//второй конструктор создает объект по заданной строке
stroka(const char *arch)
{len=strlen(arch);
ch=new char[len+1];
strcpy(ch,arch);
}
void display()
{cout<<"\nДлина строки: "<<len;
cout<<"\nСодержимое строки: "<<ch;
}
~stroka()//деструктор
{delete[]ch;}
};
Напишем программу создания объектов-строк и вывода информации о них на экран.
#include “stroka.cpp”
void main()
{stroka object1(“abcdefgh”);//вызов второго конструктора
stroka object2(20);//вызов первого конструктора
object1.display();
object2.display();
}
Результат
Длина строки: 8
Содержимое строки: abcdefgh
Длина строки: 0
Содержимое строки:
В данном примере был описан деструктор, который уничтожил объекты при выходе из функции.
Если в классе нет конструктора, то компилятор предоставляет программисту два конструктора: конструктор по умолчанию и копирующий конструктор.
Конструктор по умолчанию – это конструктор, не требующий аргументов. Это может быть конструктор с пустым списком параметров. Основные действия конструктора по умолчанию сводятся к выделению памяти под элементы класса. Но если требуется выполнить какие-то дополнительные действия, то необходимо явно определить конструктор по умолчанию в классе.
Рассмотрим пример класса, содержащего три конструктора: конструктор по умолчанию, конструктор с одним параметром и конструктор с двумя параметрами.
#include <iostream.h>
class Exanple
{public:
int a,b;
Example()//конструктор по умолчанию
{a=b=0;}
Example(int i)
{a=b=i;}
Example(int i,int j)
{a=i;
b=j;
}
};
void main()
{Example x;
Example y(10);
Example z(4,7);
cout<<”x.a=”<<x.a<<”<,x.b=”<<x.b<<”\n”;
cout<<”y.a=”<<y.a<<”<,y.b=”<<y.b<<”\n”;
cout<<”z.a=”<<z.a<<”<,z.b=”<<z.b<<”\n”;
}
Результат
x.a=0,x.b=0
y.a=10,y.b=10
z.a=4,z.b=7
Перегрузка конструкторов позволяет создавать объекты различными способами.
Присваивание объектов
Если два объекта имеют одинаковый тип (т.е. оба они объекты одного класса), то один объект можно присвоить другому.
Если один объект присваивается другому, то данные первого объекта поразрядно копируются во второй. После выполнения присваивания объекты будут идентичными.
Пример
#include <iostream.h>
class Value
{int a;
public:
void set(int i)
{a=i;}
void output()
{cout<<”\n”<<”a=”<<a;}
};
void main()
{Value object1, object2;
object1.set(10);
object2.set(0);
object2=object1;
object1.output();
object2.output();
}
Результат
а=10
а=10
После выполнения присваивания оба объекта содержат одинаковые значения.