Автор: Пользователь скрыл имя, 08 Ноября 2011 в 12:07, шпаргалка
Работа содержит ответы на вопросы по дисциплине "Программирование".
Инкапсуляция – механизм, связывающий данные и код и сохраняющий их от внешнего воздействия и ошибочного использования.
Полиморфизм обеспечивает возможность использования одного кода для решения разных задач. Реализуется ч\з механизм виртуальных функций и перегрузки и переопределения.
Наследование, благодаря которому один объект наследует свойства другого объекта, добавляя к нему свои.
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
Базовыми блоками ООП являются объект и класс. Объект С++ - абстрактное описание некоторой сущности, например, запись о человеке. Формально объект определить достаточно сложно. Класс – это множество объектов, имеющих общую структуру и поведение.
struct str
{ char a[10];
double b;
};
str s1,s2;
Все данные делятся на локальные и глобальные. Локальные данные недоступны (через окно). Доступ к ним и их модификация возможна только из компонент-функций этого объекта. Глобальные данные видны и модифицируемы через окно (извне). Для активизации объекта (чтобы он что-то выполнил) ему посылается сообщение. Сообщение проходит через окно и активизирует некоторую глобальную функцию. Тип сообщения определяется именем функции и значениями передаваемых аргументов. Локальные функции (за некоторым исключением) доступны только внутри класса.
Говоря о реализации объекта, мы подразумеваем особенности реализации функций соответствующего класса (особенности алгоритмов и кода функций).
Объект включает в себя все данные, необходимые, чтобы описать сущность, и функции или методы, которые манипулируют этими данными.
Основная идея класса как абстрактного типа заключается в разделении интерфейса и реализации.
Интерфейс показывает, как можно использовать класс. При этом совершенно неважно, каким образом соответствующие функции реализованы внутри класса.
Реализация – внутренняя особенность класса. Одно из требований к реализации – критерий изоляции кода функции от воздействия извне. Это достигается использованием локальных компонент данных и функций.
#include <iostream.h>
class kls
{ int max,a,b,c;
public:
void init(void);
void out();
private:
int f_max(int,int,int);
};
void kls::init(void) // инициализация компонент a, b, c класса
{ cout << “Введите 3 числа ";
cin >> a >> b >> c;
max=f_max(a,b,c); // обращение к функции, описанной как private
}
void kls::out(void) // вывод max числа на экран
{ cout <<"\n MAX из 3 чисел = " << max <<' endl;
}
int kls::f_max(int i,int j, int k) ); // функция нахождения наибольшего из
{
int kk;
if(i>j) if(i>k) return i;
else return k;
else if(j>k) return j;
else return k;
}
void main()
{ kls k; // объявление объекта класса kls
k.init(); // обращение к public функциям ( init и out)
k.out();
}
Конструктор – функция, имя которой совпадает с именем класса, в котором он объявлен и используется. Он ничего не возвращает. К. м.б. без параметров, с параметрами по умолчанию, с параметрами и копии. Функции к.: выделить память под объект и инициализации (заносит начальные данные).
~Деструктор – метод, приводящий к разрушению объекта соответствующего класса и возвращающий системе область памяти, выделенную конструктором.
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<<
}
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);
}
В примере целочисленный размер массива м.б. передан в качестве параметра конструктору и недопустимы преобразования целых чисел во временный объект.
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 компилятор тебя пошлет! Ффот ))))