Проблемы при возвращении ссылки или указателя. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Проблемы при возвращении ссылки или указателя.



int *f1(int n)
{
int nN=n*5;
//return &nN;
}
//функция возвращает указатель на область памяти в стеке, которая после возвращения из функции может быть задействована компилятором для других целей

int &f2(int n)
{
int nN=n*5;
return nN;
} //
функция возвращает указатель на локальную временную переменную

int main()
{
z=f2(1) +f2(2)+f2(3);
}

Нельзя возвращать адреса локальных объектов.

Возвращать можно:

1) указатель или ссылку на объект со статическим временем существования;

2) указатель на строковый литерал;

3) указатель на динамически созданный объект.

 


Ключевое слово const.

void func (const int *pn); // позволяет объявлять функции с ключевым словом const

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

void func1 (const char *pc)
{
//*pc=’A’;
}


Замечание:

1) при объявлении константных параметров ключевое слово const должно фигурировать как в объявлении функции, так и в ее определении;

2) нет необходимости объявлять с идентефикатором const параметры, которые представляют значение объекта, так как функция получает только копии исходных переменных.

void func(const int n);

“Перегрузка” имён функции.

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

 Этот механизм возможен ввиду того, что функции с одним и тем же именем, но с разным количеством и разными типами параметров компилятор декорирует по-разному.

 

Ограничение в использовании перегрузки:

1) не могут перегружаться функции, имеющие совпадающий тип и число аргументов, но разные типы возвращающих значений;

2) не могут перегружаться функции, имеющие неявно совпадающие типы аргументов.

int MaxInt(int x; int y)
{
return (x>y);
}
double MaxDouble (double x, double y)
{
return (x>y);
}


//примеры без перегрузки

main()
{
int i=MaxInt (12,8);
double d= MaxDouble(1.1;2.2);
}


C перегрузкой:

main()
{
int i=Max(12,8);
double d= Max(1.1, 2.2);
double dd=Max(1.1, 2); //ERROR!!
}
void f(int x, int y=5);


Возможный конфликт при использовании параметров по умолчанию.

void f(int x, int y = 0);

void f (int);

int main () {

f (2, 5); // ошибка

f (5); // ошибка, компилятор не знает, какую функцию вызывать.

}

Рекурсивные функции.

 Вызывают сами себя.

 Происходит выполнение одного и того же кода с разными наборами данных.

 Каждое выполнение тела функции имеет свою область стека для параметров и локальных переменных.

Достоинства:

Ø компактность.

Недостатки:

Ø большие затраты времени на вызов функции;

Ø большие затраты памяти (стека) для организации каждого вложенного цикла.

Специфика рекурсивных функций:

1) программист должен обеспечивать выход из рекурсии;

2) по мере возможности следует избегать использования с рекурсивной функцией локальных переменных.


Факториал без рекурсии:


int n=5;
int res=1;
for(int i=n; i>1; i--)
res *=i;
int F(int n)
{
if (n<=1)
return 1;
else
{
int x=F(n-1);
     return n*x;
}
}

Структуры Си.

 В большом количестве случаев удобно обращаться к совокупности переменных Структура языка Си – средство для укрупнения данных.

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

struct имя
{
список полей структуры
}
struct student
{
char name[30]
unsigned int cource,
bool sex;
int age;

}


Создание объектов структуры.

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

student vasya;

Си: struct student vasya;

Присваивание значений полям структуры.

vasya. age=20;
vasya. sex=1;
vasya. cource=1;
strcpy(vasya. name, “Vasiliy”);

[struct] student g_182_4[20];
g_182.4[0]. age=18;

Создание структур – типов данных.

 Применяется при программировании на языке Си и используется для создания своих собственных типов данных.

typedef struct
{
char name[30]
...
int age;
}
student;
student pety;

Инициализация структур.

[struct] student Ira ={“Irina”, 2, 0, 19, …};

Замечание: инициализация указывается в том порядке, в котором соответствующие поля объявлены в структуре.

 Инициализация массивов структур похожа на инициализацию многомерных массивов.

{
“Masha”, 1, 0, 18…
}

Действия со структурами.

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

[struct] student Balabanov1={“Anton”, 2, 0, 19, …};
[struct] student Balabanov2=Balabanov1;
strcpy(Balabanov2. Name, “Vladimir”);
Balabanov2=Balabanov1;

Указатели и структуры.

[struct] student *man1=new[struct] student;

 Для обращения к полям структуры посредством указателя используется селектор

->(минус больше)

strcpy(man1->name, “Yan”);
man1->sex=1;
man1->age=25;
man1->course=1;



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 37; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.85.33 (0.009 с.)