Rect(int, int, int, int);

Rect(const Rect&);

Rect(const Rect&, int=0, int=0);

}

Rect::Rect()

{

a=b=w=h=0;

}

Rect::Rect(int X, int Y)

{

a=X;

b=Y;

w=100;

h=100;

}

Rect::Rect(int X, int Y, int W, int H)

{

a=X; b=Y; w=W; h=H;

}

Rect::Rect(const Rect& rs)

{

a=rs.a;

b=rs.b;

w=rs.w;

h=rs.h;

}

Rect::Rect(const Rect& rs, int A, int B);

{

a=A;

b=B;

w=rs.w;

h=rs.h;

}

Int main()

{

Rect Z(5,10,20,30);

Rect S(Z,40,15);

}

Неоднозначность перегрузки

Перегруженные функции выбираются по принципу наилучшего соответствия объявлений функций в текущей области видимости аргументам, предоставленным в вызове функции. Если подходящая функция найдена, эта функция и вызывается. Слово "подходящая" в этом контексте означает одно из следующего (в порядке ухудшения соответствия):

ü найдено точное соответствие;

ü выполнено тривиальное преобразование;

ü выполнено преобразование целочисленных типов;

ü существует стандартное преобразование к желаемому типу аргумента;

ü существует определенное программистом преобразование (оператор преобразования или конструктор) к требуемому типу аргумента;

ü были найдены аргументы, представленные многоточием.

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

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

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

Все сказанное выше относилось ко всем перегруженным функциям, безотносительно к тому, являются ли они функциями-членами или нет. Рассмотрим теперь специфику перегруженных функций-членов.

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

В отношении перегруженных конструкторов язык C++ предоставляет дополнительную возможность по управлению процессом поиска соответствия вызываемого конструктора. Ключевое слово explicitпредставляет собой спецификатор объявления, который может применяться только в объявлениях конструкторов (но не в определениях конструкторов вне класса).

Конструктор, объявленный со спецификатором explicit, не принимает участия в неявных преобразованиях типа. Он может быть использован только в том случае, когда никакого преобразования типа аргументов не требуется. Например, для класса, объявленного выше.








Дата добавления: 2016-10-17; просмотров: 420;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.