Манипуляции с состоянием объекта

Ссылки

В С++ введен ссылочный тип данных.Описание ссылки вводит идентификатор, который будет псевдонимом (alias)для объекта, указанного при инициализации. Ссылка с точки зрения реализации

является адресом объекта. Отличие ссылочного типа от типа «указатель» заклю-чается во множестве операций, применимых для этого типа. Ссылке сопоставля-ется некоторый адрес единственный раз при ее инициализации. Проинициали-зированная ссылка в дальнейшем не может быть изменена. Так же как и указатель,

ссылка является типизированной. Синтаксис определения ссылки:

inta = 5;

int&aa = a; // ссылка обязана иметь начальное

// значение!

// a и aa ссылаются на одно и то же

// целое число

a = aa + 1;

cout<<a<<aa; // будет выведено “6 6”, поскольку

// a и aa – одна и та же сущность

if(&aa == &a) { . . . }; // адрес ссылки равен адресу

// самого объекта!

// можно инициировать ссылку

// константным значением, если

// сама ссылка тоже константная:

constint&aa1 = 1; // ссылка на константу 1

doubleb[10];

double&bb = b[9]; // псевдоним для b[9]

int&x = * newint;

delete& x;

Синтаксис описания класса

classИмя_класса { определение_членов_класса };

Члены класса можно разделить на информационные члены и функции-члены(методы) класса. Информационные члены описывают внутреннюю структуруинформации, хранящейся в объекте, который создается на основе класса. Методыкласса описывают алгоритмы обработки этой информации.Данные, хранящиеся в информационных членах, описывают состояниеобъекта, созданного на основе класса. Состояние объекта изменяется на основеизменения хранящихся данных с помощью методов класса. Алгоритмы, зало-женные в реализации методов класса, определяют поведениеобъекта, то естьреагирование объекта на поступающие внешние воздействия в виде входныхданных.

Манипуляции с состоянием объекта

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

classstack {

int* c1;

inttop, size;

public:

intputnewsize(intns){

if(top > ns) return1;

int* nc1 = new int[ns];

if(top > 0)

for(inti = 0; i < top; i++)

nc1[i] = c1[i];

deletec1;

c1 = nc1;

size = ns;

return0;

}

};

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

В классах С++ неявно введен специальный указатель this– указатель натекущий объект. Каждый метод класса при обращении к нему получает данныйуказатель в качестве неявного параметра. Через него методы класса могут по-лучить доступ к другим членам класса.

Указатель thisможно рассматривать как локальную константу, имеющуютип X*, если X– имя описываемого класса. Нет необходимости использовать егоявно. Он используется явно, например, в том случае, когда выходным значением

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

уже было указано, инициализируется непосредственным значением.

classx {

public:

x& f(. . .){

. . .

return*this;

}

};

Одиночное наследование. Правила наследования

Правила наследования

Наследование является одним из трех основных механизмов ООЯП. В ре-зультате использования механизма наследования осуществляется формирование иерархических связей между описываемыми типами. Тип-наследник уточняет базовый тип.

Манипуляции с состоянием объекта - student2.ru Прототип объявления типа-наследника:

structA {

intx,y;

};

structB: A {

intz;

};

A a1;

B b1;

b1.x = 1;

b1.y = 2;

b1.z = 3;

a1 = b1;

Объект типа Bнаследует свойства объекта типа A.

Таким образом, объект типа-наследника содержит внутри себя члены ба-зового типа:

Манипуляции с состоянием объекта - student2.ru

При наследовании наследуются не только информационные члены, но иметоды.

Не наследуются:

􀂃 Конструкторы

􀂃 Деструктор

􀂃 Операция присваивания

Как уже было описано, единственный способ использования конструктора

базового класса – список инициализации. Он записывается при описании кон-

структора производного класса:

Манипуляции с состоянием объекта - student2.ru

При создании объекта производного типа Bсначала будет вызван конст-руктор базового типа A. При

этом если конструктору базового типа нужны па-раметры, то его необходимо вызывать явно в списке инициализации. Затембудет вызван конструктор производного типа B.Деструкторы вызываются в обратном порядке. При разрушении объектапроизводного типа сначала будет вызван деструктор этого типа, а затем дест-руктор базового типа.Допустимо присвоение объекту базового типа объекта производного типа.При этом объекту базового типа будет присвоена та часть объекта производного

типа, которая структурно совпадает с базовым типом.

Параметры шаблона

Для описания шаблонов используется ключевое слово template, вслед за которым указываются аргументы (формальные параметры шаблона), заключен-ные в угловые скобки. Формальные параметры шаблона перечисляются через

запятую, и могут быть как именами объектов, так и параметрическими именами типов (встроенных или пользовательских). Параметр-тип описывается с помощью служебного слова classили служебного слова typename.

В соответствии со Стандартом ISO 1998 C++ метром шаблона может быть:

− параметрическое имя типа

− параметр-шаблон

− параметр одного из следующих типов:

􀀹 интегральный

􀀹 перечислимый,

􀀹 указатель на объект любого типа (встроенного или пользователь-ского) или на функцию

􀀹 ссылка на объект любого типа (встроенного или пользователь-ского) или на функцию

􀀹 указатель на член класса, в частности, указатель на метод класса

− знаковые и беззнаковые целые типы,

− bool, char, wchar_t

Примечание.Перечислимые типы не относятся к интегральным, но их значения

приводятся к ним в результате целочисленного повышения.

При использовании типа в качестве параметра перед параметром, являю-щимся параметрическим именем типа, необходимо использовать одно из клю-чевых слов: либо class,либо typename.

Примечание.Не все компиляторы обрабатывают вложенные шаблоны (например,Microsoft* VisualC++ 6*: VisualStudio 98*). Тем не менее, шаблонный класс может использоваться в качестве значения параметра по умолчанию. Далее будет рассмотреншаблонный класс со следующим прототипом:

template<classT , classA=allocator <T>>сlassvector

{ . . .};

В разделе 14.1.7 Стандарта явно сказано, что нетиповый параметр не может

иметь тип void, пользовательский тип, или плавающий тип, например:

// template<doubled>classX{ . . . }; // ошибка

template<double* d>classX{ . . . }; // OK

63.Разработать класс Student (Фамилия, Имя, Отчество, Дата рождения, Адрес, Телефон, Факультет, Курс). Включить в класс методы set (…), get (…), show (…). Определить другие методы. Создать массив объектов. Вывести список студентов, родившихся после заданного года.

#include <iostream>

#include <conio.h>

#include <string.h>

using namespace std;

Struct date

{char daymon[6];

int year; };

//======= class Student =================

class Student{

char name[30];

date t;

char adr[30], fac[20],phone[20];

int kurs;

public:

Student();

char *getfac();

char *getphone();

int getyear();

int getkurs();

void show();

};

Student::Student()

{cout<<"Input name:"; cin>>name;

cout<<"Input date of born\n";

cout<<"Day.mon:"; cin>>t.daymon;

cout<<"Year:"; cin>>t.year;

cout<<"Input adr:"; cin>>adr;

cout<<"Input fac:"; cin>>fac;

cout<<"Input kurs:"; cin>>kurs;

cout<<"Input phone:"; cin>>phone;

}

Void Student::show()

{

cout<<"Name :"<<name<<endl;

cout<<"Was born :"<<t.daymon<<'.'<<t.year<<endl;

cout<<"Address :"<<adr<<endl;

cout<<"Fac :"<<fac<<endl;

cout<<"Kurs :"<<kurs<<endl;

cout<<"phone :"<<phone<<endl;

}

char *Student::getfac() { return fac; }

char *Student::getphone() { return phone; }

int Student::getkurs() { return kurs; }

int Student::getyear() { return t.year ; }

void spisfac(Student spis[],int n)

{char fac[20];

cout<<"Input faculty:"; cin>>fac;

for(int i=0;i<n;i++)

if(strcmp(spis[i].getfac(),fac)==0)spis[i].show();

}

void spisfachage(Student spis[],int n)

{int i,k;

char fac[20];

cout<<"Input faculty:"; cin>>fac;

cout<<"Input year:"; cin>>k;

for(i=0;i<n;i++)

if ((strcmp(spis[i].getfac(),fac)==0)&&(spis[i].getyear()>k))

spis[i].show();

}

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {

Student *spis;

int n;

cout<<"Input a number of students: "; cin>>n;

spis=new Student [n];

for(int i=0;i<n;i++) {

cout<<"=============================="<<endl;

spis[i].show();

}

//spisfac(spis,n);

spisfachage(spis,n);

delete [] spis;

cout<<"press any key!";

while(!kbhit());

return 0;

}

66.Разработать класс Book (Автор, Название, Издательство, Год, Количество страниц). Включить в класс методы set (…), get (…), show (…). Определить другие методы. Создать массив объектов. Вывести список книг, выпущенных после заданного года.

#include <iostream>

#include <conio.h>

#include <string.h>

using namespace std;

class Book {

char Autor[40];

char Title[40];

char Publish[40];

int Year;

int Sheet_num;

public:

Book (const char *a,const char *b,const char *c, int i, int n) {

strcpy(Autor, a);

strcpy(Title, b);

strcpy(Publish, c);

Year = i;

Sheet_num = n;

}

char *get_aut() {return Autor;}

char *get_tit() {return Title;}

char *get_pub() {return Publish;}

int get_year() {return Year;}

int get_num() {return Sheet_num;}

void set_aut(char *aut) {strcpy(Autor, aut);}

void set_tit(char *tit) {strcpy(Title, tit);}

void set_pub(char *pub) {strcpy(Publish, pub);}

void set_year(int y) {Year = y;}

void set_num(int num) {Sheet_num = num;}

void show() {

cout << "Author: " << Autor<<'\t';

cout << "Book title: " << Title <<'\t';

cout << "Publishing house: " << '\"'<< Publish <<'\"'<< '\t';

cout << "The year of publishing: " << Year <<'\t';

cout << "Number of pages: " << Sheet_num<<"\n\n";

}

};

void SeekOnAutor(const char *str, Book *ob) {

cout << "List of author's books " << str << ": ";

for(int i=0; i<6; i++) {

if(!strcmp((ob[i].get_aut()), str)) ob[i].show();

}

cout << '\n';

}

void SeekOnPublish(const char *str, Book *ob) {

cout << "List of books of the publishing house " << str << ": ";

for(int i=0; i<6; i++) {

if(!strcmp((ob[i].get_pub()), str)) ob[i].show();

}

cout << '\n';

}

void SeekOnYear(int h, Book *ob) {

cout << "List of books after the year of publication " << h << ": ";

for(int i=0; i<6; i++) {

if(ob[i].get_year() >= h) ob[i].show();

}

cout << '\n';

}

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {

setlocale (LC_ALL, "Russian");

Book ob[] = {

Book("Vern","20 000 Leagues under the sea","Extremo",1995,125),

Book("Dostoevskiy", "Crime and Punishment", "Extremo", 2000, 350),

Book("Dostoevskiy", "White Nights", "Piter", 1998, 200),

Book("Shekspir", "Hamlet", "Extremo", 1999, 100),

Book("Shekspir", "King Lear", "Piter", 1996, 150),

Book("Vern", "Around the world in 80 Days", "Piter", 1997, 150)

};

ob[1].show();

cout << ob[2].get_aut()<< '\n';

char choice, str[40];

int h;

for (;;) {

do {

cout<< "Select the menu item:\n"

<< " 1. List of books by author\n"

<< " 2. List of books by the name of the publishing house\n"

<< " 3. List of books after the year of publication\n"

<< "Select the help option (q to exit): ";

cin>> choice;

} while (choice<'1' || choice>'3'&& choice!='q');

if (choice=='q') break;

cout<<"\n\n";

switch(choice) {

case '1':

cout << "Enter the name of the author: ";

cin >> str;

SeekOnAutor(str, ob);

break;

case '2':

cout << "Enter the name of the publishing house: ";

cin >> str;

SeekOnPublish(str, ob);

break;

case '3':

cout << "Enter starting year: ";

cin >> h;

SeekOnYear(h, ob);

break;

}

cout<<"\n";

}

return 0;

}

69.Разработать класс Train (Пункт назначения, Номер поезда, Время отправления, Число общих мест, Купейных, Плацкартных). Включить в класс методы set (…), get (…), show (…). Определить другие методы. Создать массив объектов. Вывести список поездов, отправляющихся до заданного пункта назначения и имеющих общие места.

#include <iostream>

#include <conio.h>

#include <string.h>

using namespace std;

Class train

{

char punkt [20];

int num_train;

double time;

int Placard;

int Kupeynykh;

int common;

public:

train();

char *getpunkt();

int getnum_train();

double gettime();

int getPlacard();

int getKupeynykh();

int getcommon();

void show();

};

Train::train()

{

cout <<"input punkt:";cin>>punkt;

cout <<"input num_train:";cin>>num_train;

cout <<"input time:";cin>>time;

cout <<"input Placard:";cin>>Placard;

cout <<"input Kupeynykh:";cin>>Kupeynykh;

cout <<"input common:";cin>>common;

}

Void train::show()

{

cout<<"punkt:"<<punkt<<endl;

cout<<"num_train:"<<num_train<<endl;

cout<<"time:"<<time<<endl;

cout<<"Placard:"<<Placard<<endl;

cout<<"Kupeynykh:"<<Kupeynykh<<endl;

cout<<"common:"<<common<<endl;

}

char *train::getpunkt() {return punkt;}

int train::getnum_train() { return num_train; }

double train::gettime() { return time; }

int train::getPlacard() { return Placard; }

int train::getKupeynykh() { return Kupeynykh; }

int train::getcommon() { return common; }

void spistrian(train spis[],int n)

{

// int train;

// cout<<"input train:"; cin>>train;

for (int i=0;i<n;i++)

// if(strcmp(spis[i].getnum_train(),train)==0)

spis[i].show();

}

void spistrianpunkt(train spis [], int n)

{

int i,k;

char punkt[20];

//int trian();

//cout<<"input trian:"; cin>>trian;

cout<<"input serchin punkt:"; cin>>punkt;

for(i=0;i<n;i++)

if ((strcmp(spis[i].getpunkt(),punkt)==0))

spis[i].show();

}

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {

train *spis;

int n;

cout<<"input a number of train:"; cin>>n;

spis=new train [n];

for (int i=0;i<n;i++)

{

cout<<"=========="<<endl;

spis[i].show();

}

//cout<<"=======================";

spistrianpunkt(spis,n);

delete [] spis;

cout<<"press sny key!";

while(!kbhit());

return 0;

}

72.Разработать класс Product (Наименование, Производитель, Цена, Срок хранения, Количество). Включить в класс методы set (…), get (…), show (…). Определить другие методы. Создать массив объектов. Вывести список товаров для заданного наименования, цена которых не превышает указанной.

#include <iostream>

#include <conio.h>

#include <string.h>

using namespace std;

Struct date

{char daymon[6];

int year; };

Class product

{

char product_name [30];

double price;

date t;

char Manufacturer[30];

int Quantity;

public:

product();

char *getproduct_name();

char *getManufacturer();

double getprice();

int getyear();

int getdata();

int getQuantity();

void show();

};

Product::product()

{

cout <<"input product_name:";cin>>product_name;

cout <<"input Manufacturer:";cin>>Manufacturer;

cout<<"Input date_of_manufacture";

cout<<"Day.mon:"; cin>>t.daymon;

cout<<"Year:"; cin>>t.year;

cout <<"input price:";cin>>price;

cout <<"input Quantity:";cin>>Quantity;

}

Void product::show()

{

cout<<"product_name:"<<product_name<<endl;

cout<<"Manufacturer:"<<Manufacturer<<endl;

cout<<"Was date_of_manufacture :"<<t.daymon<<'.'<<t.year<<endl;

cout<<"price:"<<price<<endl;

cout<<"Quantity:"<<Quantity<<endl;

}

char *product::getproduct_name() {return product_name;}

char *product::getManufacturer() { return Manufacturer; }

double product::getprice() { return price; }

int product::getyear() { return t.year ; }

int product::getQuantity() { return Quantity; }

void spisproduct(product spis[],int n)

{

// double;

//cout<<"input product:"; cin>>product;

for (int i=0;i<n;i++)

//if(strcmp(spis[i].getproduct_name(),product)==0)

spis[i].show();

}

void spisproduct_price(product spis [], int n)

{

int i,k;

double price;

//int year;

//cout<<"input product:"; cin>>product;

cout<<"input serchin price:"; cin>>price;

for(i=0;i<n;i++)

if (spis[i].getprice()<price)

spis[i].show();

}

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {

product *spis;

int n;

cout<<"input a number of product:"; cin>>n;

spis=new product [n];

for (int i=0;i<n;i++)

{

cout<<"=========="<<endl;

spis[i].show();

}

spisproduct_price(spis,n);

delete [] spis;

cout<<"press sny key!";

while(!kbhit());

return 0;

}

75.Разработать класс Patient (Фамилия, Имя, Отчество, Адрес, Номер медицинской карты, Диагноз). Включить в класс методы set (…), get (…), show (…). Определить другие методы. Создать массив объектов. Вывести список пациентов, имеющих указанный адрес.

#include <iostream>

#include <conio.h>

#include <string.h>

using namespace std;

class patient{

char familyname[30];

char firstname[30];

char patronymic[30];

int cardnumber;

char address[20],diagnosis[20];

public:

patient();

char *getfamilyname();

char *getfirstname();

char *getpatronymic();

char *getdiagnosis();

char *getaddress();

int getcardnumber();

void show();

};

Patient::patient()

{cout<<"Input familyname:"; cin>>familyname;

cout<<"Input firstname";cin>>firstname;

cout<<"Input patronymic:"; cin>>patronymic;

cout<<"Input diagnosis:"; cin>>diagnosis;

cout<<"Input address";cin>>address;

cout<<"Input cardnumber:"; cin>>cardnumber;

}

Void patient::show()

{

cout<<"familyname:"<<familyname<<endl;

cout<<"firstname:"<<firstname<<endl;

cout<<"patronymic:"<<patronymic<<endl;

cout<<"diagnosis:"<<diagnosis<<endl;

cout<<"address:"<<address<<endl;

cout<<"cardnumber:"<<cardnumber<<endl;

}

char *patient::getfamilyname() { return familyname; }

char *patient::getfirstname() { return firstname; }

char *patient::getpatronymic() { return patronymic; }

char *patient::getdiagnosis() { return diagnosis; }

char *patient::getaddress() { return address ; }

int patient::getcardnumber() { return cardnumber; }

void spispatient(patient spis[],int n)

{

//char specified address[20];

//cout<<"Input specified address:"; cin>>specified address;

for(int i=0;i<n;i++)

//if(strcmp(spis[i].getspecified address(),specified address)==0)spis[i].show();

spis[i].show();

}

void spisaddress(patient spis[],int n)

{

int i,k;

char specifiedaddress[20];

//cout<<"Input patient:"; cin>>patient;

cout<<"Input specifiedaddress:"; cin>>specifiedaddress;

for(i=0;i<n;i++)

if ((strcmp(spis[i].getaddress(),specifiedaddress)==0))

spis[i].show();

}

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {

patient *spis;

int n;

cout<<"input a number of patient:"; cin>>n;

spis=new patient [n];

for (int i=0;i<n;i++)

{

cout<<"=========="<<endl;

spis[i].show();

}

spisaddress(spis,n);

delete [] spis;

cout<<"press sny key!";

while(!kbhit());

return 0;

}

Ссылки

В С++ введен ссылочный тип данных.Описание ссылки вводит идентификатор, который будет псевдонимом (alias)для объекта, указанного при инициализации. Ссылка с точки зрения реализации

является адресом объекта. Отличие ссылочного типа от типа «указатель» заклю-чается во множестве операций, применимых для этого типа. Ссылке сопоставля-ется некоторый адрес единственный раз при ее инициализации. Проинициали-зированная ссылка в дальнейшем не может быть изменена. Так же как и указатель,

ссылка является типизированной. Синтаксис определения ссылки:

inta = 5;

int&aa = a; // ссылка обязана иметь начальное

// значение!

// a и aa ссылаются на одно и то же

// целое число

a = aa + 1;

cout<<a<<aa; // будет выведено “6 6”, поскольку

// a и aa – одна и та же сущность

if(&aa == &a) { . . . }; // адрес ссылки равен адресу

// самого объекта!

// можно инициировать ссылку

// константным значением, если

// сама ссылка тоже константная:

constint&aa1 = 1; // ссылка на константу 1

doubleb[10];

double&bb = b[9]; // псевдоним для b[9]

int&x = * newint;

delete& x;

Синтаксис описания класса

classИмя_класса { определение_членов_класса };

Члены класса можно разделить на информационные члены и функции-члены(методы) класса. Информационные члены описывают внутреннюю структуруинформации, хранящейся в объекте, который создается на основе класса. Методыкласса описывают алгоритмы обработки этой информации.Данные, хранящиеся в информационных членах, описывают состояниеобъекта, созданного на основе класса. Состояние объекта изменяется на основеизменения хранящихся данных с помощью методов класса. Алгоритмы, зало-женные в реализации методов класса, определяют поведениеобъекта, то естьреагирование объекта на поступающие внешние воздействия в виде входныхданных.

Манипуляции с состоянием объекта

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

classstack {

int* c1;

inttop, size;

public:

intputnewsize(intns){

if(top > ns) return1;

int* nc1 = new int[ns];

if(top > 0)

for(inti = 0; i < top; i++)

nc1[i] = c1[i];

deletec1;

c1 = nc1;

size = ns;

return0;

}

};

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

В классах С++ неявно введен специальный указатель this– указатель натекущий объект. Каждый метод класса при обращении к нему получает данныйуказатель в качестве неявного параметра. Через него методы класса могут по-лучить доступ к другим членам класса.

Указатель thisможно рассматривать как локальную константу, имеющуютип X*, если X– имя описываемого класса. Нет необходимости использовать егоявно. Он используется явно, например, в том случае, когда выходным значением

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

уже было указано, инициализируется непосредственным значением.

classx {

public:

x& f(. . .){

. . .

return*this;

}

};

Наши рекомендации