Добавил:
Помощь с лабораторными, контрольными практическими и курсовыми работами по: - Инженерной и компьютерной графике - Прикладной механике Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 сем 1 курс С++ / Экзамен / Lektsii_Kurakina_2_semestr.pdf
Скачиваний:
12
Добавлен:
08.08.2022
Размер:
4.82 Mб
Скачать

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

void swap (int &i, int &j)

{int tmp;

tmp=i;

i=j;

j=tmp ;}

swap (a, b);

Следовательно, передача по ссылке позволяет функциям изменять внешние объекты, как и передача указателей.

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

Пример:

#include <iostream>

using namespace std;

main ()

{int j, k; int & i=j;

j=10;

cout << i; k=121;

i=k; cout <<j;

}

i –не зависимая или не параметрическая ссылка, которая является псевдонимом элемента j.

5.2 Передача объектов, как аргументов функции

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

Пример:

#include <iostream.h>

class OBY {int i;

public:

void set_i (int x) {i=x;}

void out_i (void) {cout <<i ;} };

void f (OBY x);

main (void)

{

OBY A;

A.set_i (10);

f (A);

A.out_i ();

}

void f (OBY x)

{

x.out_i();

x.set_i(100);

x.out_i();

}

Можно передать параметр объекта по ссылке, иными словами передать адрес объекта, в таком случае все изменения в функции изменят сам объект.

5.3 Массивы объектов

Массивы объектов создаются так же, как массивы элементов, поэтому можно создавать многомерные массивы объектов.

При создании массивов объекта в классе обязательно должен присутствовать конструктор, имеющий все параметры по умолчанию, конструктор без параметров, или, или вообще конструктора может не быть.

Пример.

class date{

int day, month, year; public:

date (int, int, int); date (int);

date (void);

void set(int, int, int); char * seazon();

int decada();

. . .

};

date::date(int a, int b, int c) {day=a; month=b; year=c;} date::date(int a)

{day=a; month=3; year=2021;} date::date(void)

{day=1; month=1; year=2000;} void date::set(int a, int b, int c) {day=a; month=b; year=c;}

. . .

data day (30, 3, 2007); data md [10];

md [0]. set (1, 1, 2000);

….

md [9]. set (1, 1, 2007);

5.4 Указатель на объект

Как и на другие типы данных ссылаться на объект можно через указатель, при этом доступ к элементам объекта осуществляется при помощи операции “→”, аналогично структурам и объединениям.

Пример:

class example {

int x;

. . .

public:

void set_num (int x1);

. . .};

void example::set_num(int x1)

{ x=x1;}

main (void) {

example ob,*p;

ob.set_num (1);

p=&ob;

p->set_num (2);

. . .}

5.5 Динамическое выделение памяти. Операторы new, delete.

Формат записи:

pointer_var=new type_var;

delete pointer_var;

где pointer_var – указатель на переменную type_var.

Операторnew выделяет соответствующее место для переменной в соответствующей области памяти и возвращает адрес выделенного места, в случае успеха и NULL, если ошибка. Оператор new сам определяет размер типа type_var и возвращает указатель, преобразованный к этому типу.

Выделение памяти под массив:

pointer_var=new type_var [SIZE]

delete [SIZE] pointer_var;

SIZE можно опустить, компилятор знает объем выделенной памяти.

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

Пример:

#include <iostream>

using namespace std;

int main (void)

{

int *p;

unsigned int size;

cout <<"Введите длину массива ;"

cin >> size;

p=new int [size];

if (! p)

{

cout<< “Недостаточно памяти;”

return 1;

}

for (int i=0; i<size; i++)

{

p[i] = i*i;

cout<<p[i];

}

delete p;

return 0;

Соседние файлы в папке Экзамен