Автор: Пользователь скрыл имя, 08 Ноября 2011 в 12:07, шпаргалка
Работа содержит ответы на вопросы по дисциплине "Программирование".
Каждому объявляемому объекту соответствует свой скрытый this-указатель; this м.б. использован только для нестатических функций; this указывает на начало своего объекта в памяти; this не надо дополнительно объявлять; this передаётся как скрытый аргумент во все нестатические компоненты-функции своего объекта: this – локальная переменная и недоступна за пределами объекта.
Пример: Упорядочивание чисел в массиве.
class Mass
{int a[3];
public:
Mass sort();
Mass *input();
void out();
};
Mass Mass::sort()
{ for(int i = 0; i < 2; i++)
for(int j = i; j < 3; j++)
if (a[i]>a[j])
{ a[i] = a[i] + a[j]; a[j] = a[i] - a[j]; a[i] = a[i] - a[j]; }
return *this; //возврат содержимого объекта
}
Mass *Mass::input()
{
for (int i = 0; i < 3; i++) cin>>a[i];
return this; //возврат адреса начала объекта
}
void Mass::out()
{
cout<<endl;
for(int i = 0; i<3; i++)
cout<< a[i] << ' ';
}
void main()
{
Mass o1;
o1.input()->sort().out()
}
Вызывается
функция input для ввода инфо в массив
объекта o1; эта функция возвращает адрес
памяти, где расположен объект o1; вызывается
функция сортировки, возвращающая содержимое
объекта о1; функция вывода инфо.
Абстра́ктный тип да́нных (АТД) — это тип данных, который предоставляет для работы с элементами этого типа определённый набор функций, а также возможность создавать элементы этого типа при помощи специальных функций. Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. Абстрактный тип данных определяет набор независимых от конкретной реализации типа функций для оперирования его значениями. Конкретные реализации АТД называются структурами данных.
В программировании абстрактные типы данных обычно представляются в виде интерфейсов, которые скрывают соответствующие реализации типов. Программисты работают с абстрактными типами данных исключительно через их интерфейсы, поскольку реализация может в будущем измениться. Такой подход соответствует принципу инкапсуляции в объектно-ориентированном программировании. Сильной стороной этой методики является именно сокрытие реализации. Раз вовне опубликован только интерфейс, то пока структура данных поддерживает этот интерфейс, все программы, работающие с заданной структурой абстрактным типом данных, будут продолжать работать. Разработчики структур данных стараются, не меняя внешнего интерфейса и семантики функций, постепенно дорабатывать реализации, улучшая алгоритмы по скорости, надежности и используемой памяти.
Различие между абстрактными типами данных и структурами данных, которые реализуют абстрактные типы, можно пояснить на следующем примере. Абстрактный тип данных список может быть реализован при помощи массива или линейного списка, с использованием различных техник динамического выделения памяти. Однако каждая реализация определяет один и тот же набор функций, который должен работать одинаково (по результату, а не по скорости) для всех реализации.
Абстрактные типы данных позволяют достичь модульности программных продуктов и иметь несколько альтернативных взаимозаменяемых реализаций отдельного модуля.
class A
{ private: int a;
public:
void set_a(int num);
int get_a();
};
void A::set_a(int num)
{ a = num;}
int A::get_a()
{ return a;}
void main()
{
A
ob1, ob2;
ob1.set_a(10);
ob2.set_a(99);
//ob1.a
= 10;//ERROR
cout << ob1.get_a() << endl;
cout << ob2.get_a() << endl;
}
В С++ ввод и вывод
данных производится потоками байт. Поток
(последовательность байт) − это
логическое устройство, которое выдает
и принимает информацию от
пользователя и связано с
физическими устройствами ввода-вывода.
При операциях ввода байты направляются
от устройства в основную память.
В операциях вывода – наоборот.
cin [>>имя_переменной]; Объект cin имеет некоторые недостатки. Необходимо, чтобы данные вводились в соответствии с форматом переменных, что не всегда может быть гарантировано.
сout << data [ << data];
data − это переменные,
константы, выражения или
типов.
Простейший пример применения cout − это вывод, например, символьной
строки:
cout << ”объектно-ориентированное
программирование ”;
cout << setw(10) << setfill('*') << a << endl;
setw(количество_позиций_для_
setfil(символ_для_заполнения_
setprecision (точность_при_выводе_дробного_
int main()
{ int a=0x11, b=4,
// целые числа:
c=051, d=8, // восьмеричное и десятичное
i,j;
i=a+b;
j=c+d;
cout << i <<' ' <<hex << i <<' '<<oct << i <<' ' <<dec << i <<endl;
cout <<hex << j <<' ' << j <<' '<<dec << j <<' ' << oct << j <<endl;
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{ int a=0x11;
double d=12.362;
cout << setw(4) << a << endl;
cout << setw(10) << setfill('*') << a << endl;
cout << setw(10 ) << setfill(' ') << setprecision(3) << d << endl;
return 0;
}
Результат работы программы:
17
********17
12.4
Различают два типа памяти: статическую и динамическую. В статической
памяти размещаются локальные и глобальные данные при их описании в функ-
циях. Для временного хранения данных в памяти ЭВМ используется динамиче-
ская память, или heap. Размер этой памяти ограничен, и запрос на динамическое
выделение памяти может быть выполнен далеко не всегда.
Для работы с динамической памятью в языке С использовались функции
calloc, malloc, realloc, free и др. В С++ для операций выделения и освобождения
памяти можно также использовать встроенные операторы new и delete.
Оператор new имеет один операнд. Оператор имеет две формы записи:
[::] new [(список_аргументов)] имя_типа [(инициализирующее_значение)]
[::] new [(список_аргументов)] (имя_типа) [(инициализирующее_значение)]
В простейшем виде оператор new можно записать:
new имя_типа или new (имя_типа)
Оператор new возвращает указатель на объект типа «имя_типа», для ко-
торого выполняется выделение памяти. Например:
char *str; // str – указатель на объект типа char
str=new char; // выделение памяти под объект типа char
или
str=new (char);
class A
{ int i; // компонента-данное класса А
public:
A(){} // конструктор класса А
~A(){} // деструктор класса А
};
int main()
{ A *a,*b; // описание указателей на объект класса А
float *c,*d;
// описание указателей на
a=new A; // выделение памяти для одного объекта класса А
b=new A[3]; // выделение памяти для массива объектов класса А
c=new float; // выделение памяти для одного элемента типа float
d=new float[4]; // выделение памяти для массива элементов типа float
delete a; // освобождение памяти, занимаемой одним объектом
delete [] b; // освобождение памяти, занимаемой массивом объектов
delete c; // освобождение памяти одного элемента типа float
delete [] d; // освобождение памяти массива элементов типа float
}
При удалении объекта оператором delete вначале вызывается деструктор
этого объекта, а потом освобождается память. При удалении массива объектов с
помощью операции delete[] деструктор вызывается для каждого элемента мас-
сива. В качестве аргументов можно использовать как стандартные типы дан-
ных, так и определенные пользователем. В этом случае именем типа будет имя
структуры или класса. Если память не может быть выделена, оператор new воз-
вращает значение NULL.