Неявное преобразование
Неявное преобразование - это автоматическое преобразование значения одного типа в другой тип, которое компилятор выполняет без явного указания со стороны программиста. Такое преобразование происходит, когда значение одного типа используется в контексте, где ожидается другой тип. Компилятор применяет набор правил для определения последовательности преобразований, которую нужно выполнить.
Неявные преобразования делятся на несколько категорий: стандартные преобразования (арифметические преобразования, преобразования указателей, преобразования в логический тип) и пользовательские преобразования (через конструкторы с одним параметром и операторы преобразования).
Синтаксис
// Арифметическое преобразование
int a = 10;
double b = a; // int неявно преобразуется в double
// Преобразование в логический тип
int c = 5;
bool d = c; // int неявно преобразуется в bool
// Преобразование через конструктор
class MyClass {
public:
MyClass(int x) {}
};
MyClass obj = 42; // int неявно преобразуется в MyClass
// Преобразование через оператор
class MyClass2 {
public:
operator int() const { return 0; }
};
MyClass2 obj2;
int e = obj2; // MyClass2 неявно преобразуется в int
Пример
Давайте рассмотрим неявное преобразование целого числа в число с плавающей точкой:
#include <iostream>
using namespace std;
int main()
{
int a = 5;
double b = a;
cout << b << endl;
return 0;
}
Результат выполнения кода:
5
Пример
Давайте рассмотрим неявное преобразование целого числа
в логический тип. Любое ненулевое значение преобразуется
в true, а нулевое - в false:
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 0;
bool c = a;
bool d = b;
cout << c << " " << d << endl;
return 0;
}
Результат выполнения кода:
1 0
Пример
Давайте рассмотрим неявное преобразование через пользовательский конструктор с одним параметром:
#include <iostream>
using namespace std;
class Number {
private:
int value;
public:
Number(int v) : value(v) {}
int getValue() const { return value; }
};
int main()
{
Number num = 42;
cout << num.getValue() << endl;
return 0;
}
Результат выполнения кода:
42
Пример
Давайте рассмотрим неявное преобразование через пользовательский оператор преобразования:
#include <iostream>
using namespace std;
class Number {
private:
int value;
public:
Number(int v) : value(v) {}
operator int() const { return value; }
};
int main()
{
Number num(42);
int res = num;
cout << res << endl;
return 0;
}
Результат выполнения кода:
42
Смотрите также
-
оператор
static_cast,
который выполняет явное преобразование на этапе компиляции -
оператор
dynamic_cast,
который выполняет безопасное преобразование полиморфных типов -
оператор
const_cast,
который снимает или добавляет квалификатор const -
оператор
reinterpret_cast,
который выполняет низкоуровневое переинтерпретирование битов