Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

int a[max]; // sizeof(a) == sizeof(int)*max

Можно определить и использовать массив массивов (двумерный массив), массив массивов массивов (многомерный массив) и т.д. Рассмотрим пример.

double da[100][200][300]; // 300 элементов типа, состоящего из

da[7][9][11] = 0;

Нетривиальное использование многомерных массивов — тонкое и уязвимое для ошибок дело (см. раздел 24.4). Если у вас есть выбор, следует предпочесть класс

Matrix
(как
в главе 24).

A.8.3. Ссылки

Ссылка (reference) — это синоним (alias), т.е. альтернативное имя объекта.

int a = 7;

int& r = a;

r = 8; // переменная a становится равной 8

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

void f(const string& s);

// ...

f("эту строку слишком дорого копировать, \\

поэтому используется ссылка");

См. разделы 8.5.4–8.5.6.

A.9. Функции

Функция (function) — это именованный фрагмент кода, получающий (возможно, пустой) набор аргументов и (необязательно) возвращающий значение. Функция объявляется с помощью указания типа возвращаемого значения, за которым следует ее имя и список параметров.

char f(string, int);

Итак,

f
— это функция, принимающая объекты типа
string
и
int
и возвращающая объект типа
char
. Если функция должна быть просто объявлена, но не определена, то ее объявление завершается точкой с запятой. Если функция должна быть определена, то за объявлением аргументов следует тело функции.

char f(string s, int i) { return s[i]; }

Телом функции должен быть блок (см. раздел 8.2) или блок

try
(см. раздел 5.6.3).

Функция, в объявлении которой указано, что она возвращает какое-то значение, должна его возвращать (используя оператор

return
).

char f(string s, int i) { char c = s[i]; } // ошибка: ничего

// не возвращается

Функция

main
представляет собой странное исключение из этого правила (см. раздел A.1.2). За исключением функции
main
, если не хотите возвращать значение, то поставьте перед именем функции ключевое слово
void
. Другими словами, используйте слово
void
как тип возвращаемого значения.

void increment(int& x) { ++x; } // OK: возвращать значение

// не требуется

Функция вызывается с помощью оператора

вызова
с соответствующим списком аргументов.

char x1 = f(1,2); // ошибка: первый аргумент функции f должен

// быть строкой

string s = "Battle of Hastings";

char x2 = f(s); // ошибка: функция f требует двух аргументов

char x3 = f(s,2); // OK

Более подробную информацию о функциях см. в главе 8.

A.9.1. Разрешение перегрузки

Разрешение перегрузки (overload resolution) — это процесс выбора функции для вызова на основе набора аргументов. Рассмотрим пример.

void print(int);

void print(double);

void print(const std::string&);

print(123); // вызывается print(int)

print(1.23); // вызывается print(double)

print("123"); // вызывается print(const string&)

Компилятор, руководствуясь правилами языка, может самостоятельно выбрать правильную функцию. К сожалению, эти правила довольно сложные, поскольку они пытаются учесть максимально сложные примеры. Здесь мы приведем их упрощенный вариант.

Выбор правильного варианта перегруженной функции осуществляется на основе поиска наилучшего соответствия между типами аргументов функции и типами ее параметров (формальных аргументов).

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

1. Точное совпадение, т.е. совпадение при полном отсутствии преобразований типов или при наличии только самых простых преобразований (например, преобразование имени массива в указатель, имени функции — в указатель на функцию и типа

T
— в тип
const T
).

2. Совпадение после продвижения, т.е. целочисленные продвижения (

bool
— в
int
,
char
— в
int
,
short
— в
int
и их аналоги без знака; см. раздел A.8), а также преобразование типа
float
в
double
.

3. Совпадение после стандартных преобразований, например,

int
— в
double
,
double
— в
int
,
double
— в
long double
,
Derived*
— в
Base*
(см. раздел 14.3),
T*
— в
void*
(см. раздел 17.8),
int
— в
unsigned int
(см. раздел 25.5.3).

4. Совпадение после преобразований, определенных пользователем (см. раздел A.5.2.3).

5. Совпадение на основе эллипсиса ... в объявлении функции (раздел A.9.3). Если найдено два совпадения, то вызов отменяется как неоднозначный. Правила разрешения перегрузки ориентированы в основном на встроенные числовые типы (см. раздел A.5.3).

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец