Хелпикс

Главная

Контакты

Случайная статья





Типы-члены. Тип-член. Определение



 

Вопросы ООП

6. Отличия С и С. Тип bool. Ссылки

В С++ введен логический тип данных bool и введены в употребление логи- ческие константы true и false.

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

Синтаксис определения ссылки: тип& идентификатор = инициализатор; int a; int & b = a; Инициализация ссылки, как обычно, записывается с помощью знака опера- ции присваивания. После инициализации идентификатор ссылки используется так же, как и переменная–инициализатор ссылки. Ссылка может быть определена и для динамического объекта: int & x = * new int; Ссылка инициализируется при передаче параметров в функцию и при пере- даче возвращаемого значения в виде псевдонима объекта, который продолжает существовать после выхода из функции (например, ссылка на текущий объект при выходе из метода).

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

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

 int* c1;

 int top, size;

 public:

 . . .

 int putnewsize(int ns){

 if (top > ns) return 1;

 int* nc1 = new int[ns];

 if (top > 0)

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

 nc1[i] = c1[i];

 delete c1;

 c1 = nc1;

 size = ns;

 return 0;

 }

};

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

18. Конструктор умолчания

Конструктор без параметров называется конструктором умолчания. Если для создания объекта не требуется каких-либо параметров, то исполь- зуется конструктор умолчания. При описании таких объектов после имени класса указывается только идентификатор переменной: class Х{ … }; Х x1; Замечание: роль конструктора умолчания может играть конструктор, у ко- торого все параметры имеют априорные значения, например: box (int l = 24, int w = 12, int h = 6);

24. Порядок вызова конструкторов и деструкторов

При создании объекта конструкторы вызываются в следующем порядке:

1) Конструкторы базовых классов, если класс для создаваемого объекта

является наследником других классов в порядке их появления в описа-

нии класса.

2) Конструкторы умолчания всех вложенных информационных членов,

которые не перечислены в списке инициализации, и конструкторы пре-

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

всех вложенных информационных членов, которые перечислены в спи-

ске инициализации.

3) Собственный конструктор.

Деструкторы вызываются в обратном порядке:

1) Собственный деструктор.

2) Деструкторы вложенных объектов в порядке, обратном порядку их

описания.

3) Деструкторы базовых классов в обратном порядке их задания.

 

Обычный конструктор (не копирования) вызывается:

1) при создании объекта ( при обработке описания объекта);

2) при создании объекта в динамической памяти (с использованием опе-

рации new).

3) при композиции объектов;

4) при создании объекта производного класса.

Конструктор копирования вызывается:

1) при инициализации создаваемого объекта:

box a(1, 2, 3); // вызов конструктора с тремя параметрами

box b = a; // инициализация

2) при инициализации временным объектом:

box c = box(3, 4, 5);

3) при передаче параметров-объектов в функцию по значению:

int f(box b);

4) при возвращении результата работы функции в виде объекта.

box f ();

Деструктор вызывается:

1) при свертке

2) при уничтожении временных объектов – сразу, как только завершится

конструкция, в которой они использовались;

3) при выполнении операции delete для указателя

4) при завершении работы программы

30. Перегрузка унарных операций

При перегрузке унарной операции в том случае, если для нее в языке опре- делены две формы – префиксная и постфиксная, имеются особенности. Для того, чтобы отличать постфиксную форму от префиксной, при пере- грузке операции в постфиксной форме в списке формальных параметров указы- вается дополнительный, неиспользуемый в алгоритме операции, параметр (точ- нее, тип параметра).

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

36. Одиночное наследование. Правила видимости при наследовании

Наследование свойств и поведения могут контролироваться с помощью квалификаторов доступа, задаваемых при наследовании: public, protected, private. Названия квалификаторов доступа совпадают с названиями ранее описанных областей доступа в классах и структурах. Квалификаторы доступа ограничивают видимость полностью или частично для полностью или частично открытых членов. Закрытые члены всегда остаются закрытыми. При наследова- нии можно уменьшить видимость членов, но не расширить их видимость. Если тип-наследник описывается структурой, то наследование по умолча- нию становится открытым.

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

тип-наследник описывается с использованием класса, следует явно указывать

квалификатор public:

class C: public A {

 int z;

};

Ограничение видимости при наследовании ограничивает манипуляции с членами базового типа только в объектах типа-наследника и его потомках. Ограничение видимости при наследовании ограничивает манипуляции с членами базового типа только в объектах типа-наследника и его потомках.

42. Реализация виртуальных функций

Для реализации механизма виртуальных функций используется специаль-

ный, связанный с полиморфным типом, массив указателей на виртуальные ме-

тоды класса. Такой массив называется Таблицей Виртуальных Методов (ТВМ).

В каждый полиморфный объект компилятор неявно помещает указатель, условно

обозначаемый как

vtbl* pvtbl,

на соответствующую ТВМ, хранящую адреса виртуальных методов.


 

В ТВМ типа-наследника имеющиеся адреса одинаковых методов замеща- ются, а новые – дописываются в конец. Издержками при использовании виртуальных функций является дополни- тельная память для неявного хранения указателя на ТВМ в каждом полиморфном объекте

48. Виртуальные базовые классы

При многоуровневом множественном наследовании базовые классы могут

быть получены от общего предка. В этом случае итоговый производный класс

будет содержать несколько подобъектов общего предка:

class W

{. . . };

class X: public W

{. . . };

class Y: public W

{. . . };

class Z: public X, public Y

{. . . };

Если необходимо, чтобы общий предок присутствовал в итоговом произ- водном классе в единственном экземпляре, то наследование базовых классов от общего предка описывается с использованием виртуального наследования

54. Алгоритм поиска оптимально отождествляемой функции (с учетом шаблонов)

С одним и тем же именем функции можно написать несколько шаблонов и перегруженных обычных функций.

 Алгоритм выбора перегруженной функции с учетом шаблонов функции.

1. Для каждого шаблона, подходящего по набору формальных параметров, осуществляется формирование специализации, соответствующей списку фактических параметров.

2. Если могут быть два шаблона функции и один из них более специали- зирован, то на следующих этапах рассматривается (порядок специализаций описан далее).

 3. Осуществляется поиск оптимально отождествляемой функции из полу- ченного набора функций, включая определения обычных функций, подходящие по количеству параметров.

4. Если обычная функция и специализация подходят одинаково хорошо, то выбирается обычная функция.

 5. если полученное множество подходящих вариантов состоит из одной функции, то вызов разрешим. Если множество пусто или содержит более одной функции, то генерируется сообщение об ошибке.

60. Контейнер список

template< class T, class Allocator = std:: allocator< T> > class list;    
     

Список представляет собой контейнер, который поддерживает быструю вставку и удаление элементов из любой позиции в контейнере. Быстрый произвольный доступ не поддерживается. Он реализован в виде двусвязного списка. В отличие от std:: forward_list этот контейнер обеспечивает возможность двунаправленного итерирования, являясь при этом менее эффективным в отношении используемой памяти.

std:: list отвечает требованиям Container, AllocatorAwareContainer, SequenceContainer и ReversibleContainer.

Типы-члены

Тип-член

Определение

value_type

T[править]

allocator_type

Allocator[править]

size_type

Беззнаковый целочисленный тип (обычно size_t)[править]

difference_type

Знаковый целочисленный тип (обычно std:: ptrdiff_t)[править]

reference

Allocator:: reference (до C++11) value_type& (начиная с C++11)

66.

 #include < iostream>

#include < cstring>

#include < clocale>

#include < cstdio>

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 < < " Автор: " < < Autor< < '\t';

   cout < < " Название книги: " < < Title < < '\t';

   cout < < " Издательство: " < < '\" '< < Publish < < '\" '< < '\t';

   cout < < " Год издания: " < < Year < < '\t';

   cout < < " Количество страниц: " < < Sheet_num< < " \n\n";

}

 

};

 

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

  cout < < " Список книг автора " < < 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 < < " Список книг издательства " < < 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 < < " Список книг после указанного года издания " < < h < < ": ";

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

 

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

}

cout < < '\n';

}

 

int main()

 

{

setlocale (LC_ALL, " Russian" );

Book ob[] = {

   Book(" Vern", " 20 000 лье под водой", " Extremo", 1995, 125),

   Book(" Dostoevskiy", " Преступление и наказание", " Extremo", 2000, 350),

   Book(" Dostoevskiy", " Белые ночи", " Piter", 1998, 200),

   Book(" Shekspir", " Гамлет", " Extremo", 1999, 100),

   Book(" Shekspir", " Король Лир", " Piter", 1996, 150),

   Book(" Vern", " Вокруг света за 80 дней", " Piter", 1997, 150)

};

ob[1]. show();

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

 

char choice, str[40];

int h;

   

   for (;; ) {

   do {

       cout< < " Выберите пункт меню: \n"

       < < " 1. Список книг по автору\n"

       < < " 2. Список книг по наименованию издательства\n"

       < < " 3. Список книг после указанного года издания\n"

       < < " Выберите вариант справки (q для выхода): ";

       cin> > choice;

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

   if (choice=='q') break;

   cout< < " \n\n";

   switch(choice) {

       case '1':

           cout < < " Введите имя автора: ";

           cin > > str;

           SeekOnAutor(str, ob);

           break;

       case '2':

           cout < < " Введите наименование издательства: ";

           cin > > str;

           SeekOnPublish(str, ob);

 

           break;

       case '3':

           cout < < " Введите отправной год: ";

           cin > > h;

           SeekOnYear(h, ob);

           break;

   }

   cout< < " \n";

   }

 

return 0;

}

#include < cstdlib>

#include < iostream>

#include < math. h>

#include < stdio. h>

#include < stdlib. h>

 

using namespace std;

class Person{

public:

char name[20];

char family[20];

char otcestvo[20];

char obrazovanie[20];

char sex[20];

char addres[20];

int god;

           

void set();

void show();

void sover();

};

    

void Person:: set(){

cout< < " vvedite imea" < < endl;

cin> > name;

cout< < " vvedite familiu" < < endl;

cin> > family;

cout< < " vvedeite otcestvo" < < endl;

cin> > otcestvo;

cout< < " vvedite obrazovanie" < < endl;

cin> > obrazovanie;

cout< < " vvedite pol" < < endl;

cin> > sex;

cout< < " vvedite addres" < < endl;

cin> > addres;

cout< < " vvedite vozrast" < < endl;

cin> > god;

}

    

void Person:: show(){

cout< < " Imea: " < < name< < endl;

cout< < " Familia: " < < family< < endl;

cout< < " Otcestvo: " < < otcestvo< < endl;

cout< < " Obrazovanie: " < < obrazovanie< < endl;

cout< < " Pol: " < < sex< < endl;

cout< < " Addres: " < < addres< < endl;

cout< < " Vozrast: " < < god< < endl;

}

void Person:: sover(){

int m=2011;

int sover;

sover=m-god;

if(sover> 18)

cout< < " Soverwenoletnii" < < endl;

else

  cout< < " Malenikii" < < endl;

}

    

     

int main(int argc, char *argv[])

{

Person A; //ñîçäГ*åà îáúåêò ГЄГ«Г*Г±Г±Г*

cout< < " Vvedite INFO: " < < endl;

cout< < endl;

A. set();

cout< < " InFo" < < endl;

cout< < endl;

A. show();

cout< < endl;

cout< < " Vicisleaem vozrast" < < endl;

A. sover();

system(" PAUSE" );

   

}



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.