Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск

Кто сейчас на форуме
Сейчас посетителей на форуме: 2, из них зарегистрированных: 0, скрытых: 0 и гостей: 2

Нет

[ Посмотреть весь список ]


Больше всего посетителей (7) здесь было Сб Июн 17, 2017 3:57 pm
Самые активные пользователи за неделю


Как не запутаться в const

Предыдущая тема Следующая тема Перейти вниз

Как не запутаться в const

Сообщение автор Ярослав в Чт Дек 07, 2017 2:56 pm

const использовать по-разному в разных ситуациях

При передаче параметра в функцию:

1) Для простых типов:

void f (int a); — параметр a передаётся копированием. Копию можно изменять
void f (const int a); — параметр a передаётся копированием. Копию нельзя изменять. На практике const int a никто не пишет, т.к. это лишнее слово без какой-либо выгоды

2) Для указателей:

void f (char *p) — передаётся указатель на данные типа char либо массив char (char[]). Если разыменовать указатель p, данные можно менять.
void f (const char *p) — передаётся указатель на данные типа (const char) либо массив (const char) (const char[]). Если разыменовать указатель p, данные нельзя менять (можно только читать).

Важно! Здесь есть опасность, что функция f будет изменять данные, указатель на которые вы передали. Для защиты от этого указатель всегда, когда можно, защищают словом const.

3) Для ссылок: аналогично указателям. Обычно тип тут не char, а какой-нибудь класс.

void f (string &s) — передаётся ссылка на существующий где-либо объект string s. Функция может изменять объект s.
void f (const string &s) — передаётся ссылка на объект string s, но тип помечен как константный (ссылка на const string). Функция не может изменять объект s, только читать.

Хорошо Передача по ссылке экономит ресурсы и время (не надо создавать копию)
Важно! Передача по ссылке вносит риск, что функция будет злоупотреблять своими правами и изменит объект string s. Это часто нежелательно (и неожиданно: функция имеет побочный эффект). Ссылку, как правило, защищают словом const.

Мораль:
• Простые данные — копируем
• Массивы — передаём указателем (const, если не планируем их изменять в функции)
• Объекты — передаём ссылкой (const, если не планируем их изменять в функции)

Передача значения возврата из функции

1) Для простых значений:

int f () — функция возвращает новое значение int
const int f () — функция возвращает новое значение типа const int (неизменяемый int). Почти всегда это то же самое, что и int f (), только дольше писать. Поэтому пишут просто int f ().

2) Для указателей:

char *f () — функция возвращает указатель на изменяемые данные. Получатель может с помощью такого указателя изменять данные.
const char *f () — функция возвращает указатель на константные (неизменяемые) данные

Указатель в качестве типа возврата используется относительно редко. Пример использования: гет-функция приоткрывает доступ к данным класса. Обычно данные, открытые укзаателем, стараются защитить от нежелательных изменений, то есть пишут тип возврата const char *. Однако вполне возможны сценарии, где надо вернуть указатель на изменяемые данные (если данные НАДО менять).

3.1) Для класса:

string f () — тут написано, что функция возвращает новый объект string (копию либо совершенно новый). Иногда желательно возвратить копию объекта, а иногда нет. Обсуждение ниже, в пункте 3.

3.2) Для ссылок (обычно в сочетании с классом):

string &f () — функция возвращает ссылку на существующий объект string. Получатель этой ссылки сможет по ней изменять данные.
const string &f () — функция возвращает ссылку на существующий объект string; но тип возвращаемой ссылки защищён константностью. Получатель такой ссылки сможет читать данные, но не изменять.

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

Арифметические операторы (наподобие A + B):
• Возвращают новый объект, вычисленный как A + B
• В процессе A и B читаются, но не изменяются
• Рекомендуется оформлять как отдельно стоящую дружественную функцию
• Пример подписи:
Код:
friend string operator + (const string &a, const string &b);
• Тип возврата — ново созданный объект string
• a и b передаются по ссылке
• a и b защищены от нежелательных изменений
• friend функция оформляется с двумя параметрами

Операторы присваивания (наподобие A = B):
• Рекомендуется оформлять как функцию-член класса A
• Изменяют объект A в процессе
• Объект B используется в режиме только для чтения
• Возвращает сам объект A, точнее, ссылку на него (изменяемую)
Код:
string &operator = (const string &b);

Префиксные и постфиксные операторы имеют собственные правила.

Префиксные (++A, --A):
• Все унарные операторы оформляются как функция-член класса A
• Изменяют объект A в процессе
• Возвращает сам объект A, точнее, ссылку на него (изменяемую) (с тем, чтобы объект A можно было изменять дальше)
• Без дополнительного параметра
Код:
string &operator ++ ();

Постфиксные (A++, A--):
• Все унарные операторы оформляются как функция-член класса A
• Изменяет объект A в процессе
• Запоминает копию объекта A в начале операции. Возвращает копию старого состояния объекта A.
• Имеет фиктивный параметр типа int, позволяющий отличать префиксную форму от постфиксной.
Код:
string operator ++ (int);
avatar
Ярослав
Admin

Posts : 346
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения