15.10.2. Функции-кандидаты

15.10.2. Функции-кандидаты

Функцией-кандидатом называется функция с тем же именем, что и вызванная. Предположим, что имеется такой вызов:

SmallInt si(15);

add( si, 566 );

Функция-кандидат должна иметь имя add. Какие из объявлений add() принимаются во внимание? Те, которые видимы в точке вызова.

Например, обе функции add(), объявленные в глобальной области видимости, будут кандидатами для следующего вызова:

const matrix& add( const matrix &, int );

double add( double, double );

int main() {

SmallInt si(15);

add( si, 566 );

// ...

}

* Рассмотрение функций, чьи объявления видны в точке вызова, производится не только для вызовов с аргументами типа класса. Однако для них поиск объявлений проводится еще в двух областях видимости: если фактический аргумент – это объект типа класса, указатель или ссылка на тип класса либо указатель на член класса и этот тип объявлен в пользовательском пространстве имен, то к множеству функций-кандидатов добавляются функции, объявленные в этом же пространстве и имеющие то же имя, что и вызванная:

namespace NS {

class SmallInt { /* ... */ };

class String { /* ... */ };

String add( const String &, const String & );

}

int main() {

// si имеет тип class SmallInt:

// класс объявлен в пространстве имен NS

NS::SmallInt si(15);

add( si, 566 ); // NS::add() - функция-кандидат

return 0;

}

* Аргумент si имеет тип SmallInt, т.е. тип класса, объявленного в пространстве имен NS. Поэтому к множеству функций-кандидатов добавляется add(const String &, const String &), объявленная в этом пространстве имен; если фактический аргумент – это объект типа класса, указатель или ссылка на класс либо указатель на член класса и у этого класса есть друзья, имеющие то же имя, что и вызванная функция, то они добавляются к множеству функций-кандидатов:

namespace NS {

class SmallInt {

friend SmallInt add( SmallInt, int ) { /* ... */ }

};

}

int main() {

NS::SmallInt si(15);

add( si, 566 ); // функция-друг add() - кандидат

return 0;

}

Аргумент функции si имеет тип SmallInt. Функция-друг класса SmallInt add(SmallInt, int) – член пространства имен NS, хотя непосредственно в этом пространстве она не объявлена. При обычном поиске в NS функция-друг не будет найдена. Однако при вызове add() с аргументом типа класса SmallInt принимаются во внимание и добавляются к множеству кандидатов также друзья этого класса, объявленные в списке его членов.

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

Рассмотрим следующий пример:

namespace NS {

class SmallInt {

friend SmallInt add( SmallInt, int ) { /* ... */ }

};

class String { /* ... */ };

String add( const String &, const String & );

}

const matrix& add( const matrix &, int );

double add( double, double );

int main() {

// si имеет тип class SmallInt:

// класс объявлен в пространстве имен NS

NS::SmallInt si(15);

add( si, 566 ); // вызывается функция-друг

return 0;

}

* Здесь кандидатами являются: глобальные функции:

const matrix& add( const matrix &, int )

double add( double, double )

* функция из пространства имен:

NS::add( const String &, const String & )

* функция-друг:

NS::add( SmallInt, int )

При разрешении перегрузки выбирается функция-друг класса SmallInt NS::add( SmallInt, int ) как наилучшая из устоявших: оба фактических аргумента точно соответствуют заданным формальным параметрам.

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Функции

Из книги Microsoft Office автора Леонтьев Виталий Петрович

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


Функции

Из книги Эффективное делопроизводство автора Пташинский Владимир Сергеевич

Функции Excel – серьезная программа для вычислений, одним из главных достоинств которой является множество встроенных функций. Это обширная тема, достойная если не книги, то главы в многотомном руководстве. Рассмотрим ее кратко – ровно настолько, чтобы вы могли далее


19.7.8. Функции

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

19.7.8. Функции Описание функции выглядит так: имя() { список; }Пример:cdir(){ # изменяем каталог cd / }При выполнении функция не создает нового процесса, а выполняется в среде процесса, содержащего эту функцию. Аргументы функции можно передать ей как обыкновенные параметры при


6.12. Функции

Из книги Феномен науки. Кибернетический подход к эволюции автора Турчин Валентин Фёдорович


4.5.3. Функции, которые создают новые конфигурации из существующих 4.5.3.1. Функции геометрии, которые производят новые конфигурации

Из книги MySQL: руководство профессионала автора Паутов Алексей В

4.5.3. Функции, которые создают новые конфигурации из существующих 4.5.3.1. Функции геометрии, которые производят новые конфигурации Раздел "4.5.2. Функции Geometry" обсуждает несколько функций, которые создают новые конфигурации из


10.16 Функции TCP

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

10.16 Функции TCP Данная глава посвящена многочисленным функциям TCP. Ниже перечислены основные из них:? Связывание портов с соединениями? Инициализация соединений посредством трехшагового подтверждения? Выполнение медленного старта, исключающего перегрузку


Функции GMP

Из книги Справочник по PHP автора

Функции GMP ПодразделыФункции Введение Функции этого вида позволяют работать с целыми числами повышенной точности определенного формата используя библиотеку GNU MP.Эта библиотека не входит в стандартный пакет PHP. Загрузить коды библиотеки и документацию по ней можно на


8.6. Функции

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

8.6. Функции Оператор определения функции имеет следующий синтаксис:[function] имя() { список}Определять функцию можно в любом месте сценария, но вызов ее должен осуществляться строго после описания. Вызывается функция подобно любой команде — по имени. Переданные ей аргументы


Функции

Из книги Русский справочник по Win32 API автора Сорока Тарас

Функции AddAtom Функция AddAtom добавляет строку символов в таблицу локальных атомов и возвращает уникальное значение (атом), идентифицирующее строку. ATOM AddAtom ( LPCTSTR lpString // указатель на добавляемую строку ); Параметры lpString - указатель на добавляемую строку, завершающуюся нулем.


7. Функции

Из книги C++ для начинающих автора Липпман Стенли

7. Функции Мы рассмотрели, как объявлять переменные (глава 3), как писать выражения (глава 4) и инструкции (глава 5). Здесь мы покажем, как группировать эти компоненты в определения функций, чтобы облегчить их многократное использование внутри программы. Мы увидим, как


15.10.2. Функции-кандидаты

Из книги автора

15.10.2. Функции-кандидаты Функцией-кандидатом называется функция с тем же именем, что и вызванная. Предположим, что имеется такой вызов:SmallInt si(15);add( si, 566 );Функция-кандидат должна иметь имя add. Какие из объявлений add() принимаются во внимание? Те, которые видимы в точке


15.12.1. Операторные функции-кандидаты

Из книги автора

15.12.1. Операторные функции-кандидаты Операторная функция является кандидатом, если она имеет то же имя, что и вызванная. При использовании следующего оператора сложенияSmallInt si(98);int iobj = 65;int res = si + iobj;операторной функцией-кандидатом является operator+. Какие объявления operator+


19.3.1. Функции-кандидаты

Из книги автора

19.3.1. Функции-кандидаты Наследование влияет на первый шаг процедуры разрешения перегрузки функции – формирование множества кандидатов для данного вызова, причем это влияние может быть различным в зависимости от того, рассматривается ли вызов обычной функции видаfunc( args


Функции

Из книги автора

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