/**
* 隐式类型转换 :是指编译器在某些情况下自动将一种数据类型转换为另一种数据类型,以确保程序的正常运行。隐式转换可以发生在以下几种情况下:
* 基本数据类型之间的转换,例如从 int 转换为 float。
* 指针类型之间的转换,例如从派生类指针转换为基类指针。
* 用户自定义类型的转换,通过定义转换构造函数或转换运算符。
* 首先,对于内置类型,`低精度的变量给高精度变量赋值`会发生隐式类型转换,其次,对于只存在单个参数的构造函数的对象构造来说,
* 函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象。 UserInfo(int val){} UserInfo info = 6;
*
* C++ 中的隐式类型转换是指在某些情况下,编译器会自动将一个数据类型转换为另一个数据类型,以便在不同类型之间进行操作或赋值。
* 这种转换是自动进行的,程序员不需要显式地指定类型转换操作。todo `隐式类型转换的目的是为了方便编码和提高代码的可读性`,但有时也可能引起意想不到的结果。
* 尽管隐式类型转换在某些情况下很方便,但它也可能引起一些问题,例如精度丢失、意外的行为等。为了避免这些问题,有时需要显式地进行类型转换,以确保程序的行为是符合预期的。
*
* 必要时,可以使用 explicit 关键字来禁止隐式转换
*
*/
//派生类指针向基类指针的转换
class BaseI {
public:
virtual void show() {
std::cout << "Base class" << std::endl;
}
};
class DerivedI : public BaseI {
public:
void show() override {
std::cout << "Derived class" << std::endl;
}
};
class ImplicitConversion {
public:
ImplicitConversion() {}
void task1() {
// 整数类型之间的转换
int a = 5;
double b = a; // 整数转换为浮点数
XLOG_INFO("b: {0}", b);//5
//字符类型和整数类型的转换
char c = 'A';
int n = c; // 字符转换为对应的 ASCII 值
XLOG_INFO("n: {0}", n);//65
//窄类型到宽类型的转换
int x = 10;
long y = x; // 将 int 转换为 long
XLOG_INFO("y: {0}", y);//10
//枚举类型到整数类型的转换
enum Day { Monday, Tuesday, Wednesday };
int dayValue = Tuesday; // 枚举类型转换为整数类型
XLOG_INFO("dayValue: {0}", dayValue);//1
DerivedI d;
BaseI *ptr = &d; // 派生类指针转换为基类指针
ptr->show();// 调用 DerivedI 类的 show 方法
}
//转换运算符
//double x = q_ImplicitConversion;
operator double() const {
return static_cast<double>(numerator);
}
void task2() {}
~ImplicitConversion() {}
private:
int numerator;
};