Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры ппвис 2 часть с++.doc
Скачиваний:
26
Добавлен:
01.03.2016
Размер:
265.22 Кб
Скачать

33. Перегрузка оператора ”[ ]” для класса со структурными членами-данными (массива).

Оператор индексации [ ] по правилам перегрузки считается бинарным. Из этого следует, что операторная функция должна иметь параметр, который задает индекс.

Чтобы использование операторная [ ] сделать возможным в левой и в правой частях оператора присваивания для одномерных массивов, операторная функция должна возвращать ссылку на элемент массива. В этом случае можно будет как передавать значение индекса в класс, так и получать значение индекса в класс, так и получать значение элемента массива класса с заданным индексом.

#include <iostream.h>

class strukt {

public: struct Node { char m_name[15];

char m_autor[15];

int m_page;

int m_kol;

} x[3];

strukt (char *name, char *autor, int page, int kol)

{ strcpy(x.m_name, name);

strcpy(x.m_autor, autor);

x.m_page=page;

x.m_kol=kol;

}

strukt (strukt &obj)

{ strcpy(x.m_name, obj.x.m_name);

strcpy(x.m_autor, obj.x.m_autor);

x.m_page=obj.x.m_page;

x.m_kol=obj.x.m_kol;

}

TO_SHOW()

{ cout<<x.m_name<<endl<<x.m_autor<<endl<<x.m_page<<endl<<x.m_kol<< endl<<endl; }

int operator[](int Index)

{ if (Index>=0)

return x[Index];

else cout<<”ERROR”;

}

};

34. Перегрузка оператора ”=” для класса со структурными членами-данными (массива).

#include <iostream.h>

#include <string.h>

class strukt {

public: struct Node { char m_name[15];

char m_autor[15];

int m_page;

int m_kol;

} x;

strukt (char *name, char *autor, int page, int kol)

{ strcpy(x.m_name, name);

strcpy(x.m_autor, autor);

x.m_page=page;

x.m_kol=kol;

}

strukt (strukt &obj)

{ strcpy(x.m_name, obj.x.m_name);

strcpy(x.m_autor, obj.x.m_autor);

x.m_page=obj.x.m_page;

x.m_kol=obj.x.m_kol;

}

TO_SHOW()

{cout<<x.m_name<<endl<<x.m_autor<<endl<<x.m_page<<endl<<x.m_kol<< endl<<endl;

}

strukt& operator=(strukt &obj)

{ strcpy(x.m_name, obj.x.m_name);

strcpy(x.m_autor, obj.x.m_autor);

x.m_page=obj.x.m_page;

x.m_kol=obj.x.m_kol;

return *this;

}

};

int main ()

{ strukt y1("mama", "papa", 45, 87), y2("wawa", "kaka", 54, 98);

y1.TO_SHOW();

y2.TO_SHOW();

y1=y1;

y1.TO_SHOW();

}

35. Перегрузка оператора ”=” для класса с динамическими членами-данными (динамической строки).

#include <iostream.h>

#include <string.h>

class String {

private: char *str;

public: String()

{

str= new char;

str='\0';

}

String (char *s)

{

int kol=strlen(s);

str=new char (kol);

if (!str)

cout<<"ERROR";

strcpy(str, s);

}

String (String &obj)

{

int kol=strlen(obj.str);

str=new char (kol);

if (!str)

cout<<"ERROR";

strcpy(str, obj.str);

}

TO_SHOW()

{

cout<<str<< endl<<endl;

}

String& operator=(String &obj)

{

int kol=strlen(obj.str);

if (kol > strlen(str))

{

delete [] str;

str=new char (kol);

if (!str)

cout<<"ERRoR";

strcpy(str, obj.str);

}

return *this;

}

/*

~ String ()

{

delete [] str;

}

*/

};

int main ()

{

String x1(), x2("mama"), x3("papa");

x2.TO_SHOW();

x3.TO_SHOW();

x2=x3;

x2.TO_SHOW();

return 0;

}

36. Наследование. Базовый и производные классы. Описание, спецификаторы доступа.

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

Базовый – класс который наследуется. Производный – новый класс.

Пример:

class A{ //базовый класс

};

class B : public A{ //public наследование

}

class C : protected A{ //protected наследование

}

class Z : private A{ //private наследование

}

В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:

при public-наследовании все спецификаторы остаются без изменения.

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

при private-наследовании все спецификаторы меняются на private. Существуют одиночное и множественное наследование. А также прямое и косвенное.