C++——类型转换

一、C语言中的类型转换

在C语言中,当赋值、传参、还有接受函数返回值时,如果类型不匹配就会发生类型转换,这又分类隐式类型转换显示类型转换

隐式类型转换:在代码编译阶段自动进行,能转就转,不能转就编译失败

显示类型转换:用户自己进行处理的转换

C++——类型转换_第1张图片

缺陷:
转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

二、C++中的四种强制类型转换         

标准 C++ 为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast reinterpret_cast const_cast dynamic_cast

① static_cast

显式表明这步转换使用的是隐式类型转换形式。但它不能用于两个不相关的类型进行转换

    int a = 10;
    double b = 12.34;
    // a = b; // 隐式类型转换
    a = static_cast(b);
    cout << a << endl;

② reinterpret_cast

把内存中的数据重新解析,用于将一种类型转换为另一种不同的类型

    int* p = &a;
    // int address = (int)p; // 显式类型转换
    int address = reinterpret_cast (p);
    将地址转化为整形int量
    cout << address << endl;

③ const_cast

删除变量的const属性

    const int c = 10;
    // int* pc = &c; 普通的指针pc无法指向c,因为指针pc具有被修改的可能。
    int* pc = const_cast(&c);

④ dynamic_cast

dynamic_cast 用于将一个父类对象的指针 / 引用转换为子类对象的指针或引用 ( 动态转换 )
向上转型:子类对象指针 / 引用 -> 父类指针 / 引用 ( 不需要转换,赋值兼容规则 )
向下转型:父类对象指针 / 引用 -> 子类指针 / 引用 ( dynamic_cast 转型是安全的 )
注意:
1. dynamic_cast 只能用于父类含有虚函数的类
2. dynamic_cast 会先检查是否能转换成功,能成功则转换,不能则返回 0++
class A
{
public:
	virtual void f()
	{
		cout << "A::f()" << endl;
	}
};


class B : public A
{
public:
	virtual void f()
	{
		cout << "B::f()" << endl;
	}

	void fb()
	{
		_b = 10;
		cout << _b << endl;
		cout << "B::fb()" << endl;
	}

private:
	int _b;
};


void fun(A* pa)
{
	pa->f();

	// 当pa指向子类的对象时,让其调用fb方法
	// 如果pa指向的是基类的对象时,则不调用
	// 因为fb是子类中的方法,父类中没有
	B* pb = dynamic_cast(pa);  // 向上转型
	if (pb)
	{
		pb->fb();
	}
}


int main()
{
	A a;   // 基类对象
	B b;   // 子类对象
	fun(&a);
	fun(&b);
	return 0;
}

你可能感兴趣的:(C++——类型转换)