Условно, все преобразования типов во многих языках, в том числе и C++, можно разделить на четыре основные группы:
#include <iostream> using namespace std; class Digit { private: int dig; public: Digit(int iDig){ dig=iDig; } void Show(){ cout<<dig<<"\n"; } }; void main() { // преобразование от int к Digit Digit A(5); A.Show(); // преобразование от double к Digit Digit B(3.7); B.Show(); }
Исходя из примера можно сделать вывод, что конструктор с одним аргументом Class::Class(type) всегда определяет преобразование типа type к типу Class, а не только способ создания объекта при явном обращении к нему.
Для преобразования абстрактного типа к стандартному или абстрактного к абстрактному в С++ существует средство - функция, выполняющая преобразование типов, или оператор-функция преобразования типов. Она имеет следующий синтаксис:
Class::operator type (void);
Эта функция выполняет определенное пользователем преобразование типа Class к типу type. Эта функция должна быть членом класса Class и не иметь аргументов. Кроме того, в ее объявлении не указывается тип возвращаемого значения. Обращение к этой функции может быть как явным, так и неявным. Для выполнения явного преобразования можно использовать как традиционную, так и "функциональную" форму.
#include <iostream> using namespace std; class Number{ private: int num; public: Number(int iNum){ num=iNum; } void Show(){ cout<<num<<"\n"; } }; class Digit { private: int dig; public: Digit(int iDig){ dig=iDig; } void Show(){ cout<<dig<<"\n"; } //преобразование от Digit к int operator int (){ return dig; } //преобразование от Digit к Number operator Number (){ return Number(dig); } }; void main() { Digit A(5); cout<<"In Digit A:\n"; A.Show(); // преобразование от Digit к int int a=A; cout<<"In int a:\n"; cout<<a<<"\n"; Digit B(3); cout<<"In Digit B:\n"; B.Show(); Number b(0); cout<<"In Number b (before):\n"; b.Show(); //преобразование от Digit к Number b=B; cout<<"In Number b (after):\n"; b.Show(); }