C++类型强制转换
2016-04-11 16:50
603 查看
C++有以下几种类型转化:
1.static_cast
2.reinterpret_cast
3.const_cast
4.dynamic_cast
static_cast:用于隐式类型的转化。
如:
float a = 3.5;
int b = 5;
int *p = NULL;
a = static_cast<float>(b);
b = static_cast<int>(a);
//注意这里malloc的返回值是void *类型
//不允许将void *类型赋值给基本类型指针,却可以将基本类型指针赋值给void *类型。
p = static_cast<int *>malloc(sizeof(int));
reinterpret_cast:用于无隐式的类型转化,static_cast已不可用的情况
如:
3.const_cast:脱常,const_cast<type>,这里的type必须是指针或引用或指向变量的指针。
如:
这里可以将const int类型的变量作为实参赋给int&类型,这就是一种const_cast的使用,但是使用const_cast的结果是不确定的,不推荐使用。
如:
执行的结果:
a = 10,&a = 0x28fe94,ca = 10&ca0x28fe94
a = 50,&a = 0x28fe94,ca = 10&ca0x28fe94
p->value = 15, m_test.value = 15
p->value = 20, m_test.value = 20
4.dynamic_cast动态类型转化,转化通常使用在类继承的相关操作中,需构成多态,这样动态转化才有意义。如下代码:
#include <iostream>
class A
{
public:
virtual void fun1()
{
std::cout<<"A::fun1()"<<std::endl;
}
~A(){}
};
class B:public A
{
public:
void fun()
{
std::cout<<"B::fun()"<<std::endl;
}
};
class C
{
public:
void fun()
{
std::cout<<"C::fun()"<<std::endl;
}
};
int main(void)
{
B b;
A* pa = &b;
B* pb = dynamic_cast<B*>(pa);
C* pc = dynamic_cast<C*>(pa);
if(pb != NULL)
{
pb->fun();
}
if(pc != NULL)
{
pc->fun();
}
return 0;
}
打印结果:
B::fun()
根据结果显示的内容可以知道pb不等与NULL,而pc等于NULL。由于class B继承于class A,并且A中有虚函数,pa地址等于&b,所以使类B的地址,只不过是A*类型,所以将pa动态转化成pb没有问题。(如果不动态转化,不能将父类指针传给子类指针。)此时pb就是&b的值。
而class C由于没有继承成class A,故动态转化并没有实际意义,此时转化使成功的,但是返回的使NULL,故也不能调用fun()。(但是有些编译器是可以的,并且也能打印C::fun(),但是调试都可以发现pc的值是NULL)
1.static_cast
2.reinterpret_cast
3.const_cast
4.dynamic_cast
static_cast:用于隐式类型的转化。
如:
float a = 3.5;
int b = 5;
int *p = NULL;
a = static_cast<float>(b);
b = static_cast<int>(a);
//注意这里malloc的返回值是void *类型
//不允许将void *类型赋值给基本类型指针,却可以将基本类型指针赋值给void *类型。
p = static_cast<int *>malloc(sizeof(int));
reinterpret_cast:用于无隐式的类型转化,static_cast已不可用的情况
如:
char *p1;
int *p2;
p1 = reinterpret_cast<char*>(p2);
3.const_cast:脱常,const_cast<type>,这里的type必须是指针或引用或指向变量的指针。
如:
void function(int &a)
{
}
int main()
{
const int a = 10;
function(const_cast<int&>(a));
}
这里可以将const int类型的变量作为实参赋给int&类型,这就是一种const_cast的使用,但是使用const_cast的结果是不确定的,不推荐使用。
如:
int main()
{
const int ca = 10;
int& a = const_cast<int&>(ca);
cout<<"a = "<<a<<",&a = "<<&a<<",ca = "<<ca<<"&ca"<<&ca<<endl;
a = 50;
cout<<"a = "<<a<<",&a = "<<&a<<",ca = "<<ca<<"&ca"<<&ca<<endl;
struct test
{
int value;
};
const test m_test = {15};
test* p = const_cast<test*>(&m_test);
cout<<"p->value = "<<p->value<<", m_test.value = "<<m_test.value<<endl;
p->value = 20;
cout<<"p->value = "<<p->value<<", m_test.value = "<<m_test.value<<endl;
}
执行的结果:
a = 10,&a = 0x28fe94,ca = 10&ca0x28fe94
a = 50,&a = 0x28fe94,ca = 10&ca0x28fe94
p->value = 15, m_test.value = 15
p->value = 20, m_test.value = 20
4.dynamic_cast动态类型转化,转化通常使用在类继承的相关操作中,需构成多态,这样动态转化才有意义。如下代码:
#include <iostream>
class A
{
public:
virtual void fun1()
{
std::cout<<"A::fun1()"<<std::endl;
}
~A(){}
};
class B:public A
{
public:
void fun()
{
std::cout<<"B::fun()"<<std::endl;
}
};
class C
{
public:
void fun()
{
std::cout<<"C::fun()"<<std::endl;
}
};
int main(void)
{
B b;
A* pa = &b;
B* pb = dynamic_cast<B*>(pa);
C* pc = dynamic_cast<C*>(pa);
if(pb != NULL)
{
pb->fun();
}
if(pc != NULL)
{
pc->fun();
}
return 0;
}
打印结果:
B::fun()
根据结果显示的内容可以知道pb不等与NULL,而pc等于NULL。由于class B继承于class A,并且A中有虚函数,pa地址等于&b,所以使类B的地址,只不过是A*类型,所以将pa动态转化成pb没有问题。(如果不动态转化,不能将父类指针传给子类指针。)此时pb就是&b的值。
而class C由于没有继承成class A,故动态转化并没有实际意义,此时转化使成功的,但是返回的使NULL,故也不能调用fun()。(但是有些编译器是可以的,并且也能打印C::fun(),但是调试都可以发现pc的值是NULL)
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性