Программирование >>  Инициализация объектов класса, структура 

1 ... 149 150 151 [ 152 ] 153 154 155 ... 395


libs R us::max( int, int );

вызова видны только

libs R us::max( double, double );

void func()

using-объявление

глобальная функция max( char, char ) скрыта ing libs R us::max;

max( 87, 65 ); вызается libs R us::max( int, int )

max( 35.5, 7 6.6 ); вызается libs R us::max( double, double ) max( J, L ); вызается libs R us::max( int, int )

Они и являются кандидатами. Теперь вызовы func() разрешаются следующим образом:

Using-директивы также оказывают влияние на состав множества функций-кандидатов. Предположим, мы решили их использовать, чтобы сделать функции max() из пространства имен libs R us видимыми в func() . Если разместить следующую using-директиву в глобальной области видимости, то множество функций-кандидатов будет состоять из глобальной функции max(char, char) и функций max(int, int) и

namespace libs R us { int max( int, int ); double max( double, double );

char max( char, char );

using namespace libs R us; using-директива

void func() {

max( 87, 65 ); вызается libs R us::max( int, int )

max( 35.5, 7 6.6 ); вызается libs R us::max( double, double )

max( J, L ); вызается ::max( int, int )

max(double, double) , объявленных в libs R us:

Что будет, если поместить using-директиву в локальную область видимости, как в следующем примере?

Какие из функций miax() будут включены в множество кандидатов? Напомним, что using-объявления вкладываются друг в друга. При наличии такого объявления в локальной области глобальная функция max(char, char) оказывается скрытой, так что в точке



void func() {

using-директива using namespace libs R us;

те же вызовы функций, что и выше

Какие из функций miax() окажутся среди кандидатов? Напомним, что using-директива делает члены пространства имен видимыми, словно они были объявлены вне этого пространства, в той точке, где такая директива помещается. В нашем примере члены libs R us видимы в локальной области функции func() , как будто они объявлены вне пространства - в глобальной области. Отсюда следует, что множество перегруженных

max( char, char ); libs R us::max( int, int );

функций, видим1х внутри func(), то же, что и раньше, т.е. включает в себя

libs R us::max( double, double );

В локальной или глобальной области видимости появляется using-директива, на

void func() {

using namespace libs R us;

max( 87, 65 ); вызается libs R us::max( int, int )

max( 35.5, 76.6 ); вызывается libs R us::max( double, double ) max( J, L ); вызывается ::max( int, int )

разрешение вызовов функции func() не влияет:

Итак, множество кандидатов состоит из функций, видимых в точке вызова, включая и те, которые введены using-объявлениями и using-директивами, а также из функций, объявленных в пространствах имен, ассоциированных с типами фактических аргументов. Например:



namespace basicLib { int print( int ); double print( double );

namespace matrixLib { class matrix { /* ...

*/ };

void print( const maxtrix & );

void display() {

using basicLib::print; matrixLib::matrix mObj;

print( mObj ); вызывается maxtrixLib::print( const maxtrix & )

print( 87 ); вызывается basicLib::print( const maxtrix & )

Кандидатами для print(mObj) являются введенные using-объявлением внутри display() функции basicLib::print(int) и basicLib::print(double) , поскольку они видимы в точке вызова. Так как фактический аргумент функции имеет тип matrixLib::matrix, то функция print() , объявленная в пространстве имен matrixLib, также будет кандидатом. Каковы функции-кандидаты для print(87) ? Только basicLib::print(int) и basicLib::print(double) , видимые в точке вызова. Поскольку аргумент имеет тип int, дополнительное пространство имен в поисках других кандидатов не рассматривается.

9.4.2. Устоявшие функции

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

В следующем примере для вызова f(5.6) есть две устоявшие функции: f(int) и

void f(); void f( int ); void f( double ); void f( char*, char* );

int main() {

f( 5.6 ); 2 устоявшие функции: f( int ) и f( double ) return 0;

f(double) .

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



1 ... 149 150 151 [ 152 ] 153 154 155 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика