189 8069 5689

C++的类型转换

C++类型转换

类型转换机制可以分为:隐式类型转换 和 显示类型转换(强制类型转换)

在C中我们这样做类型转换:

成都创新互联技术团队10余年来致力于为客户提供网站建设、成都网站建设成都品牌网站建设营销型网站、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了上千多家网站,包括各类中小企业、企事单位、高校等机构单位。

float a=1.023
int b;
b=a; //隐式类型转换
或
b=int(a); //显式类型转换
或
b=(int)a;

C++中的类型转换:
隐式类型转换比较常见,在混合类型表达式中经常发生.比如在表达式中存在short和int,那么就过会发生整型提升.四种强制类型转换操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。

1、static_cast与dynamic_cast:
前者提供的是编译时期的静态类型检测,后者提供的是运行时检测.
static_cast: 1)完成基础数据类型,2)同一个继承体系中类型的转换 3)任意类型与空指针类型void*之间的转换。
dynamic_cast:使用多态的场景,增加了一层对真实调用对象类型的检查

     char c  = 65;
     int *p = (int *)&c;
     cout<<(char)*p<(&c); //编译报错:error: invalid static_cast from type ‘char*’ to type ‘int*’

在上面的例子中,Clike可以运行,然而修改过的*p如果使用,运行结果将会出现错误,而使用static_cast可以将错误在编译时期检查出
在不同继承体系的自定义类型中:

class A
{
public:
  A(){}
  ~A(){}

private:
  int i, j;
};

class C
{
public:
  C(){}
  ~C(){}

  void printC()
  {
    std::cout <<"call printC() in class C" <printC(); //"call printC() in class C"
     //ptrC = static_cast(ptrA); //编译报错:error: invalid static_cast from type 'A*’ to type C*

上面A C是两个无关的类,然而使用Clike可以实现这种类型的强制转换,这是十分危险的! 使用static_cast可以将这种潜在的危险在编译器找出来.

在同一继承体系中:

upcast(向上转换即子类转成父类):没有问题.因为父类的行为都包含在子类中;

downcast(向下转换):有可能会出现问题,编译时可能不会发现.

一个类的行为和自身的类型相关.也就是一个A类型的指针总会优先调用自己A类内的函数,当然发生继承中的重写(虚继承等)例外.

#include 
#include 

using namespace std;
class A
{
public:
  A():i(1), j(1){}
  ~A(){}

  void printA()
  {
    std::cout <<"call printA() in class A" <}
//虚函数的出现会带来动态机制 Class A 至少要有一个虚函数
void pp(){
cout<<"A pp"<}
};

class B: public A{
public:
void foo(){
cout<<"B foo"<}
void pp(){
cout<<"B PP"<}
void functionB(){
cout<<"Excute FunctionB!"<}
};

int main()
{
B b;
A pa = &b;
pa->foo();
pa->pp();
//基类指针可以指向派生类,但是只能调用基类和派生类都存在的成员,也就是说不能调用派生类中新增的成员!
//pa->FunctionB();//error: 'class A' has no member named 'FunctionB'
if(dynamic_cast>(pa) == NULL){
cout<<"NULL"<}else{
cout<>(pa))).name()<dynamic_cast>(pa)->foo();
dynamic_cast>(pa)->pp();
dynamic_cast>(pa)->functionB();
}
A aa;
//B pb = &aa;派生类不能指向基类
B
pbNull = NULL;
pbNull->functionB();//fine
pbNull->pp();//fine
//pbNull->functionB(); crash!foo调用了虚函数,编译器需要根据对象的虚函数指针查找虚函数表,但为空,crash!
return 0;
}


当前标题:C++的类型转换
分享URL:http://cdxtjz.cn/article/jehgij.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。