Преобразования, определяемые классом CPP

Условно, все преобразования типов во многих языках, в том числе и 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();
}