Читайте также:
|
|
Рассмотрим пример:
class Distance
{
private:
const float MTF;
int feet;
float inches;
public:
Distance (): feet (0), inches (0.0), MTF (3.280833F)
{ }
explicit Distance (float meters)
{ /*некоторые действич*/}
void showdist ()
{ cout << feet << "\'-" << inches << '\"'; }
};
int main ()
{
void fancyDist (Distance);
Distance dist1 (2.35F);
// Distance dist1 = 2.35F;
cout << "\ndist1 = "; dist1.showdist ();
float mtrs = 3.0F;
cout << "\nDist1 ";
// fancyDist (mtrs);
return 0;
}
///////////////////////////////////////////////////////////
void fancyDist (Distance d)
{ /*некоторые действич*/}
Аргументом ф-ии fancyDist является переменная класс Distance, и можно вызвать ф-ию fancyDist() с такой переменной без проблем.
Хитрость этой функции в том, что можно вызывать ф-ию fancyDist() с переменной типа float в качестве аргумента: fancyDist (mtrs);
Компилятор поймет, что тип аргумента неверен и будет искать операцию преобразования. Найдя конструктор Distance, который принимает в качестве аргумента переменную типа float, компилятор приспособит этот конструктор для преобразования типа float в Distance и передаст значение типа Distance в ф-ию. Это неявное преобразование, одно из тех, которые вы можете упустить из вида.
Именно для предотвращения таких случаев и используются явные конструкторы.
Дата добавления: 2015-08-17; просмотров: 109 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Преобразование типов от основного к пользовательскому. | | | Базовый и производный классы. Конструкторы производного класса. Перегрузка методов при наследовании. Алгоритм выбора перегруженного метода. |