Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по ООП.doc
Скачиваний:
34
Добавлен:
25.03.2015
Размер:
241.66 Кб
Скачать

33. Приведение типа. Неопределенность. Причины возникновения неопределенности и способы ее устранения?

Приведение типаэто преобразование значения одного типа в значение другого.

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

– разрешено использование четырех различных функций, которые соответствуют операциям "целое + целое", "целое + вещественное", "вещественное + целое", "вещественное + вещественное". В этом случае есть перегрузка, но нет приведения типа;

– разрешено использование двух различных функций: "целое + целое" и "вещественное + вещественное". Для операций "целое + вещественное" и "вещественное + целое" целое значение должно быть приведено к вещественному. В таком случае присутствует комбинация перегрузки и приведения типа;

– есть только одна функция сложения: "вещественное + вещественное". Все аргументы приводятся к типу данных "вещественное число". В этом случае нет перегрузки, а есть только приведение типов.

При выполнении операции приведения типа может возникнуть неопределенностьситуация когда компилятор не может сделать выбор между перегруженными функциями.

Неопределенные инструкции являются ошибками, и программа, содержащая неопределенности, не будет откомпилирована.

Основная и наиболее распространенная причина возникновения неопределенностей – вызов функции с одновременным автоматическим преобразованием типов.

Ошибка вызываетсяне автоматическим преобразованием типа, а особенностями вызова функции.

С++ автоматически пытается преобразовать аргументы, использованные при вызове функции, к типу аргументов интерфейса функции.

Например:

#include<iostream.h>

float myfunc(float i); // объявление функции myfunc() для значений типа float

double myfunc(double i); // объявление функции myfunc() для значений типа double

int main()

{

cout<<myfunc(10.1)<<" "; // автоматическое преобразование числа 10.1

// к типу double и вызов функции myfunc(double i)

cout<<myfunc(10)<<" "; // неопределенная ситуация

return 0;

}

float myfunc(float i)

{

return i;

}

double myfunc(double i)

{

return -i;

}

В данном примере функция myfunc()перегружена и может в качестве аргументов использовать переменные типаfloat или double.

Вызов функции со значением 10.1 не вызывает неопределенности, так как С++ автоматически преобразовывает его к типу doubleи вызывается функцияmyfunc(double i).

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

Чтобы снять неопределенность достаточно число 10 заменить числом 10.0

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

Например:

#include <iostream.h>

#include <conio.h>

int myfunc(int i);

int myfunc(int i, int j=1);

int main()

{

clrscr();

cout<<myfunc(4, 5)<<" "; // неопределенности нет

cout<<myfunc(10); // неопределенность

return 0;

}

int myfunc(int i)

{

return i;

}

int myfunc(int i, int j)

{

return i*j;

}

В данном примере при вызове функции myfunc(4, 5) неопределенности не возникает, так как здесь указываются два аргумента.

Но когда вызывается функция myfunc(10), возникает неопределенность, так как компилятор не знает, вызывать ли функциюmyfunc() с одним аргументом, или использовать функцию с двумя аргументами, у которой второй аргумент принимает значение по умолчанию.

Чтобы снять неопределенность, нужно явно указать второй аргумент.