
- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор explicit.
- •Указатель this.
- •Абстрактные типы данных.
- •Операторы для динамического выделения и освобождения памяти (new и delete).
- •Перегрузка и переопределение функций.
- •Перегрузка бинарных операторов.
- •Перегрузка унарных операторов.
- •19.20.Перегрузка оператора new.Перегрузка оператора delete.
- •22.Inline-функции.
- •23.Вложенные классы
- •24.Static-компоненты данные класса
- •25.26.Static и const-компоненты функции класса
- •27.Использование new delete для реализации массивов
- •28.Организация внешнего доступа к локальным компонентам класса(friend)
- •29.Ссылки.Параметры ссылки
- •30.Ссылки.Независимые ссылки
- •31.Инициализация компонент-данных объекта. Конструктор с параметрами.
- •33.Наследование. Открытое, защищенное и закрытое.
- •34.Виртуальные функции.
- •35.Множественное наследование.
- •36.Множественное наследование и виртуальные базовые классы
- •38.Proxi-классы.
- •39.40.Пространство имен. Пространство имен как объявление. Пространство имен как директива.
- •41.Виртуальные функции
- •42.Параметризированные классы (шаблоны).
- •43.Шаблоны функций.
- •44.Передача в шаблон класса дополнительных параметров.
- •44.Совместное использование шаблонов и наследования.
- •45.Шаблоны класса и friend.
- •46.Реализация smart-указателя.
- •48.Транзакции.
Перегрузка бинарных операторов.
тип_возвр_значения имя_класса :: operator #(список аргументов)
{ действия, выполняемые применительно к классу
};
class A
{char c; int i;
public:
A(int I = 0, char C = NULL);
A(const A&);
A operator + (A);
friend A operator - (A,A);
A operator = (A);
};
A::A(int I, char C)
{ i = I; c = C;}
A::A(A const &obj)
{ i=obj.i;
c=obj.c;
}
A A::operator + (A obj)
{
A tmp;
tmp.i = this->i + obj.i; //a+b
if(c>obj.c) tmp.c = c+1;
else tmp.c = obj.c +1;
return tmp;
}
A operator - (A obj1, A obj2)
{
A tmp;
tmp.i = obj1.i-obj2.i;
if(obj1.c<obj2.c) tmp.c = obj1.c -1;
else tmp.c = obj2.c -1;
return tmp;
}
A A::operator = (A obj)
{
this->i=obj.i;
this->c=obj.c;
return *this;
}
void main()
{
A a(2,'a'), b(4,'b'), c, d;
c = a+b;
d=c=a-b;
}
Перегрузка унарных операторов.
Перегрузка операций ++ и ––
тип_возвр_значения имя_класса :: operator #(список аргументов)
{ действия, выполняемые применительно к классу
};
class A
{ int a;
public:
A(int I = 0);
A(const A&);
A operator++();
A operator++(int);
friend A operator--(A &);
friend A operator--(A &,int );
A operator + (A);
};
A::A(int I)
{a = I;}
A::A(A const &obj)
{a=obj.a;}
A A::operator ++(int)
{ A tmp=*this; a++; return tmp;
}
A A::operator ++()
{ a++; return *this;
}
A operator --(A &obj)
{ obj.a--; return obj;
}
A operator --(A&obj,int)
{ A tmp=obj; obj.a--; return tmp;
}
A A::operator + (A obj)
{
A tmp;
tmp.a = this->a + obj.a;
return tmp;
}
void main()
{ A ob1(2),ob2(3);
ob1++ + ++ob2; //2+4
}
15.16.21.Перегрузка оператора().[].=
class A
{char *M; int len;
public:
A(const char * = "");
A(const A &);
~A();
char &operator[] (int);
A operator() (int,int);
A &operator=(const A &);
};
A::A(const char *s)
{ len = strlen(s); M = new char[len + 1]; strcpy(M, s);
}
A::A(const A ©)
{ len = copy.len; M = new char[len + 1]; strcpy(M, copy.M);
}
A::~A()
{ delete [] M;
}
A A::operator () (int index, int len)
{ int j,i,len_new;
char x[100]="\0";
if(index>=0 && index<this->len)
{ if(this->len-index+1>=len) len_new = len;
else len_new = this->len-index+1;
for(j=0,i=index; j<len_new; i++,j++)
x[j]=M[i];
x[len_new] = '\0';
}
return A(x);
}
char &A::operator[] (int j)
{ assert(j >= 0 && j < len); return M[j];
}
A& A::operator=(const A &obj)
{ if(&obj!=this)
{
delete []M; this->len=obj.len; //new len stroki
M=new char[len+1]; strcpy(M, obj.M);
}
return *this;
}
void main()
{
A s01,s02;
s02=s01(3,10);
}
Перегрузка оператора ->.
Перегрузка оператора *.
class A
{ int a,b;
public:
A(int I = 0, int J = 0);
A(const A&);
A *operator -> () {return this;} //подменяется obj его адресом
A &operator * () {return *this;}
int min();
};
A::A(int I, int J)
{a = I; b = J;}
A::A(A const &obj)
{a=obj.a; b=obj.b;}
A::min()
{
if(a<b) return a;
else return b;
}
void main()
{
A obj;
A *p; p=&obj;
p->min();
obj->min(); //нужна была перегрузка. Станет так (&obj)->min();
}