Программирование >>  Программирование на языке c++ 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 159


дартные преобразования типов, определенные в самом языке. Рассмотрим пример:

class my class {

my class(int); }; void my function(double); void my function(my class); void function(void) { my function(5); }

Здесь вызов функции my function(5), на первый взгляд, приводит к неоднозначности, поскольку выражения my function (double(5)) и my functio,n(my class(5)) являются правильными. Однако первое выражение использует только стандартное преобразование типа и именно оно будет выбрано. В результате здесь нет ошибки и производится вызов функции my function(double(5)).

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

Рассмотрим примеры. Первая программа демонстрирует преобразование стандартного типа (например, float) к типу класс (например. А) и типа класс (например. А) к стандартному типу (например, char).

#include <iostream.h>

class A {

float f;

char c; public:

A(float F) : f(F),c(#) {}

operator float() { return f; } преобразование к типу float operator char() { return c; } преобразование к типу char

void main{void) { Aa1=22.23;



float ff; char сс;

ff=a1; в результате ff=22.23

cc=a1; в результате сс=#

cout ff V сс endl;

Результат: 22.23 # cout al; ошибка из-за неоднозначности

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

#include <iostream.h> class А {

float f; public:

A(float F) : f(F) {}

operator float() { return f; }

class В {

float f; public:

B(float F) : f(F) {}

operator float() { return f; }

void f(A aa)

{ cout aa endl; } void f(B bb)

{ cout bb endl; } void ff(B bb)

{ cout bb endl; } void main(void)

{ f(10); ошибка: Ambiguty between f(A) and f(B) f(A(1.56)); Результат: 1.56 f(B(2.11)); Результат: 2.11



ff(10); Результат: 10

Здесь при вызове функции f(10) неизвестно, какой параметр ей необходимо передать: А(10) или В(10).

Третий пример показывает невозможность двух-уровнего преобразования типа (такое преобразование надо задавать явно).

#include <iostream.h> class А {

float f; public:

A{float F) : f(F) {}

operator float{) { return f; }

class В { float f; public:

B(A aa) : f(aa) {} параметром конструктора

является объект аа класса А operator float() { return f; }

void ff(B bb)

{ cout bb endl; } void main(void)

{ ff(10); ошибка: cannot convert int to B

ff(B(10)); Явное преобразование. Результат: 10 ff(B(2.11)); Явное преобразование. Результат: 2.11

Последний пример демонстрирует приоритетность стандартных преобразований типа.

#include <iostream.h>

class А {

float f; public:

A(float F) : f(F) {}



1 ... 62 63 64 [ 65 ] 66 67 68 ... 159

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