Автоматическое приведение типов в С++
При работе с переопределенными функциями не следует забывать об автоматическом приведении типов. Эти два механизма в симбиозе могут давать очень интересные, а иногда и странные результаты. Рассмотрим пример. В листинге ниже приведен исходный код программы, не содержащий перегруженных функций.
Пример. Автоматическое приведение типов
Результат выполнения такой программы будет следующим:
Пример. Перегрузка и автоматическое приведение типов
В частности, на экране в результате выполнения программы появится со общение:
Как и обычные функции, перегруженные функции могут иметь аргументы со значениями, используемыми по умолчанию. Причем для каждого варианта перегружаемой функции эти значения по умолчанию могут быть разными. Единственное, за чем необходимо постоянно следить, - чтобы наличие значений по умолчанию у аргументов не приводило к неоднозначным ситуациям при вызове перегруженной функции. Ситуацию иллюстрирует пример в следующем коде.
Пример. Перегрузка и значения по умолчанию
Пример. Автоматическое приведение типов
#includeusing namespace std; void ndiv(double x, double y){ cout << "x/y= " << x/y << endl; } int main(){ double x=10,y=3; int n=10,m=3; ndiv(x,y); ndiv(n,m); return 0; }
х/у= 3.33333 х/у= 3.33333Первая строка, которая является результатом выполнения команды ndiv(х,у), вопросов не вызывает. Результатом вызова функции частное двух чисел - аргументов функции. Хотя в команде ndiv(х,у), аргументами функции указаны целые числа, благодаря автоматическому приведению типов целочисленные значения расширяются до типа double, после чего вычисляется нужный результат. Однако стоит изменить программный код, перегрузив функцию ndiv(х,у), как показано в следующем, и результат изменится кардинально.
Пример. Перегрузка и автоматическое приведение типов
#includeusing namespace std; void ndiv(double x, double y){ cout << "x/y= " << x/y << endl; } void ndiv(int n, int m){ cout << "n/m= " << n/m << endl; } int main(){ double x=10,y=3; int n=10,m=3; ndiv(x,y); ndiv(n,m); return 0; }
х/у=3.33333 n/m=3Дело в том, что измененный программный код содержит перегруженную функцию ndiv(), для которой предусмотрен вызов как с двумя аргументами типа double, так и с двумя аргументами типа int. В последнем случае, хотя результат функции формально вычисляется так же, как и в исходном варианте, для целых чисел оператор / означает целочисленное деление с отбрасыванием остатка. Поэтому в результате получаем число 3, а не 3.33333, как для вызова функции с double-аргументами.
Как и обычные функции, перегруженные функции могут иметь аргументы со значениями, используемыми по умолчанию. Причем для каждого варианта перегружаемой функции эти значения по умолчанию могут быть разными. Единственное, за чем необходимо постоянно следить, - чтобы наличие значений по умолчанию у аргументов не приводило к неоднозначным ситуациям при вызове перегруженной функции. Ситуацию иллюстрирует пример в следующем коде.
Пример. Перегрузка и значения по умолчанию
#includeusing namespace std; void hello(){ cout<<"Hello, my friend!\n"; } void hello(char str[],char name[]="Alex"){ cout << str << ", " << name << "!" << endl; } int main(){ hello(); hello("Hello","Peter"); hello("Hi"); return 0; }