Автоматическое приведение типов в С++

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

Пример. Автоматическое приведение типов
#include 
using 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(х,у), как показано в следующем, и результат изменится кардинально.

Пример. Перегрузка и автоматическое приведение типов
#include 
using 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-аргументами.

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

Пример. Перегрузка и значения по умолчанию
#include 
using 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;
}
Онлайн всего: 2
Гостей: 2
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте