Поделиться через


Оператор явного преобразования типа: ()

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

simple-type-name ( expression-list )

Заметки

Элемент простое-имя-типа, после которого следует заключенный в скобки список-выражений, создает объект указанного типа, используя заданные выражения. В следующем примере показано явное преобразование типа в тип int.

int i = int( d );

В следующем примере используется измененная версия класса Point, определенного в разделе Результаты вызова функции.

Пример

// expre_Explicit_Type_Conversion_Operator.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class Point
{
public:
    // Define default constructor.
    Point() { _x = _y = 0; }
    // Define another constructor.
    Point( int X, int Y ) { _x = X; _y = Y; }

    // Define "accessor" functions as
    // reference types.
    unsigned& x() { return _x; }
    unsigned& y() { return _y; }
    void Show()   { cout << "x = " << _x << ", "
                         << "y = " << _y << "\n"; }
private:
    unsigned _x;
    unsigned _y;
};

int main()
{
    Point Point1, Point2;

    // Assign Point1 the explicit conversion
    //  of ( 10, 10 ).
    Point1 = Point( 10, 10 );

    // Use x() as an l-value by assigning an explicit
    //  conversion of 20 to type unsigned.
    Point1.x() = unsigned( 20 );
    Point1.Show();

    // Assign Point2 the default Point object.
    Point2 = Point();
    Point2.Show();
}

Вывод

x = 20, y = 10
x = 0, y = 0

Хотя в предыдущем примере показано явное преобразование типов с помощью констант, тот же метод применим и для выполнения таких преобразований для объектов. Это демонстрируется в следующем фрагменте кода.

int i = 7;
float d;

d = float( i );

Явные преобразования типов также можно задавать с помощью синтаксиса приведения. Предыдущий пример, перезаписанный с использованием синтаксиса приведения, выглядит следующим образом:

d = (float)i;

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

struct Point
{
    Point( short x, short y ) { _x = x; _y = y; }
    ...
    short _x, _y;
};
...
Point pt = Point( 3, 10 );

В приведенном выше примере, в котором используется преобразование в стиле функции, показано, как преобразовать два значения (одно для переменной x и другое для переменной y) в пользовательский тип Point.

Предупреждение

Явные преобразования типов следует использовать с осторожностью, поскольку они переопределяют встроенную проверку типов компилятора C++.

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

Определение типа в приведениях недопустимо.

См. также

Ссылки

Постфиксные выражения

Операторы C++

Операторы C++, приоритет и ассоциативность