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

1 ... 251 252 253 [ 254 ] 255 256 257 ... 395


class myClass {

public:

void f( double );

char f( char, char ); перегружает myClass::f( double )

...

Функции-члены класса можно перегружать:

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

class myClass {

public:

void mf();

double mf(); ...

ошибка: так перегружать нельзя

компиляции:

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

class myClass { public:

void mf();

void mf(); ошибка: повторное объявление

...

повторное объявление:

15.11. Разрешение перегрузки и функции-члены A

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

1. Отбор функций-кандидатов.

2. Отбор устоявших функций.

3. Выбор наилучшей из устоявших функции.

Однако есть небольшие различия в алгоритмах формирования множества кандидатов и отбора устоявших функций-членов. Эти различия мы и рассмотрим в настоящем разделе.

15.11.1. Объявления перегруженных функций-членов



class myClass {

public:

void mcf( double );

static void mcf( int* ); перегружает myClass::mcf( double )

...

нестатические функции:

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

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

mc.mf( arg );

Рассмотрим два вида вызовов функции-члена:

pmc->mf( arg );

где mc - выражение типа myClass, а pmc - выражение типа указатель на тип myClass . Множество кандидатов для обоих вызовов составлено из функций, найденных в области видимости класса myClass при поиске объявления mf() .

Аналогично для вызова функции вида

myClass::mf( arg );

множество кандидатов также состоит из функций, найденных в области видимости класса myClass при поиске объявления mf() . Например:

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

Множество перегруженных функций-членов может содержать как статические, так и



class myClass {

public:

void mf( double ); void mf( char, char = \n );

static void mf( int* );

int main() { myClass mc; int iobj; mc.mf( iobj );

Кандидатами для вызова функции в main() являются все три функции-члена mf() ,

void mf( double ); void mf( char, char = \n );

объявленные в myClass:

static void mf( int* );

Если бы в myClass не было объявлено ни одной функции-члена с именем mf() , то множество кандидатов оказалось бы пустым. (На самом деле рассматривались бы также и функции из базовых классов. О том, как они попадают в это множество, мы поговорим в разделе 19.3.) Если для вызова функции не оказывается кандидатов, компилятор выдает сообщение об ошибке.

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

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

class myClass { public:

void mf( double );

void mf( char, char = \n );

static void mf( int* );

int main() { myClass mc; int iobj;

mc.mf( iobj ); какая именно функция-член mf()? Неоднозначно

Например:

В этом фрагменте для вызова mf() из main() есть две устоявшие функции:



1 ... 251 252 253 [ 254 ] 255 256 257 ... 395

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