
- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор 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.Транзакции.
Базовые принципы объектно-ориентированного программирования.
Инкапсуляция – механизм, связывающий данные и код и сохраняющий их от внешнего воздействия и ошибочного использования.
Полиморфизм обеспечивает возможность использования одного кода для решения разных задач. Реализуется ч\з механизм виртуальных функций и перегрузки и переопределения.
Наследование, благодаря которому один объект наследует свойства другого объекта, добавляя к нему свои.
class A
{
public:
virtual void fun(){ cout << "fun from A" << endl;}
};
class B1:public A
{
public:
void fun(){ cout << "fun from B1" << endl;}
};
class B2:public A
{
public:
void fun(){ cout << "fun from B2" << endl;}
};
int main(){
A *p, obA;
B1 obB1;
B2 obB2;
p=&obA; // указатель на объект базового класса
p->fun();
p=&obB1; p->fun();
p=&obB2; p->fun();
return 0;
}
Базовые конструкции объектно-ориентированных программ.
Hjj
Конструктор и деструктор. Конструктор по умолчанию.
Конструктор – функция, имя которой совпадает с именем класса, в котором он объявлен и используется. Он ничего не возвращает. К. м.б. без пераметров, с параметрами по умолчанию, с параметрами и копии. Функции к.: выделить память под объект и инициализации (заносит начальные данные).
~Деструктор – метод, приводящий к разрушению объекта соответствующего класса и возвращающий системе область памяти, выделенную конструктором.
class Man
{
public:
char *FIO;
int year;
Man(char *s = "\0", int y = 0);
void print();
~Man();
};
Man ::Man(char *s, int y)
{
int len = strlen(s);
FIO = new char[len + 1];
strcpy(FIO, s);
year=y;
}
Man::~Man()
{
delete [] FIO;
}
void Man::print()
{
cout<<FIO<<'\t'<<year<<endl;
}
int main(){
Man ob("a",5);
ob.print();
return 0;
}
Конструктор копирования.
Предназначен для создания копии объекта в случае, если этот объект, например, передаётся в качестве параметра в некоторую функцию по значению, а также при возврате объекта из метода, например, локального объекта. Конструктор копии необходим в случае, если в классе содержится динамические данные.
class A
{
private:
char *str;
int len;
public:
A();
A(const A&);
~A();
};
A::A()
{
len = 20;
str = new char[len + 1];
}
A::A(A const &obj1) //copy from obj1 to obj
{
this->len = obj1.len;
str=new char[len+1];
strcpy(str,obj1.str);
}
A::~A()
{
delete []str;
}
void fun(A obj1)
{
cout<< "qwert" << endl;
}
void main()
{
A obj;
fun(obj);
}
Конструктор explicit.
В примере целочисленный размер массива м.б. передан в качестве параметра конструктору и недопустимы преобразования целых чисел во временный объект.
class Mass
{ private:
int n;
int *M;
public:
class Size
{
private:
int count;
public:
Size(int count1):count(count1){}
int size_mass() const {return count;}
};
Mass(int n, int m)
{this->n=n;
M=new int[this->n];
for(int i=0; i < this->n; i++)
M[i] = m;
}
Mass(Size s)
{
n = s.size_mass();
M = new int[n];
}
~Mass()
{
delete []M;
}
};
void main()
{
Mass ob(1);
}
Компилятор для объекта ob генерирует вызов конструктора Mass(int). Но такого не существует. Компиляторы могут преобразовывать аргумент типа int во временный объект Size, поскольку в классе Size имеется конструктор с одним параметром. Это обеспечивает успешное создание объекта.
_____________________
есть класс stown, у него есть конструктор с одним параметром stown(double k) затем мы где-нить в программе пишем: stown myCat; myCat = 19.333 // и Опа! используется stown(double) для преобразования 19.333 в stown.
а уже с explicit компилятор тебя пошлет! Ффот ))))