Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora_oop.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
258.05 Кб
Скачать
  1. Базовые принципы объектно-ориентированного программирования.

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

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

Наследование, благодаря которому один объект наследует свойства другого объекта, добавляя к нему свои.

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;

}

  1. Базовые конструкции объектно-ориентированных программ.

Hjj

  1. Конструктор и деструктор. Конструктор по умолчанию.

Конструктор – функция, имя которой совпадает с именем класса, в котором он объявлен и используется. Он ничего не возвращает. К. м.б. без пераметров, с параметрами по умолчанию, с параметрами и копии. Функции к.: выделить память под объект и инициализации (заносит начальные данные).

~Деструктор – метод, приводящий к разрушению объекта соответствующего класса и возвращающий системе область памяти, выделенную конструктором.

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;

}

  1. Конструктор копирования.

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

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);

}

  1. Конструктор 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 компилятор тебя пошлет! Ффот ))))

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]