Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

static_cast<...>(...) 显示类型转换 #27

Open
Durant35 opened this issue Jan 2, 2018 · 2 comments
Open

static_cast<...>(...) 显示类型转换 #27

Durant35 opened this issue Jan 2, 2018 · 2 comments

Comments

@Durant35
Copy link
Owner

Durant35 commented Jan 2, 2018

http://www.cnblogs.com/ider/archive/2011/07/31/cpp_cast_operator_part4.html

static_cast 真正用处并不在指针和引用上,而在基础类型和对象的转换上

  • static_cast<...>(...) 跟传统转换方式几乎是一致的,所以只要将static_cast圆括号去掉,再将尖括号改成圆括号就变成了传统的显示转换方式。

reinterpret_cast

  • reinterpret_cast<...>(...)可以在任意指针之间进行互相转换,即使这些指针所指的内容是毫无关系的,也就是说一下语句,编译器是不会报错的,但是对于程序来说也是毫无意义可言的,只会造成程序崩溃
  • 所谓 “关系”,可以是继承...
@Durant35
Copy link
Owner Author

Durant35 commented Mar 8, 2018

http://www.cnblogs.com/welfare/articles/336091.html

  • 转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。
  • 为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符
    • 转换一个类型为double的浮点数到整型
    int i;
    double d;
    
    i = (int) d;
    // or
    i = int (d);
    • 对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。
  • ANSI-C++标准定义了四个新的转换符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制类(class)之间的类型转换。
  • static_cast
    • static_cast允许执行任意的隐式转换和相反转换动作。
      • 应用到类的指针上, static_cast允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。
      • static_cast除了操作类型指针,也能用于执行类型定义的显式转换,以及基础类型之间的标准转换
  • reinterpret_cast
    • reinterpret_cast转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型;反之亦然。(译注:是指针具体的地址值作为整数值?)
    • 能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝;在类型之间指向的内容不做任何类型的检查和转换。
    • 如果情况是从一个指针到整型的拷贝,内容的解释是系统相关的;一个转换到足够大的整型能够包含它的指针是能够转换回有效的指针的。
    • reinterpret_cast就像传统的类型转换一样对待所有指针的类型转换。
  • dynamic_cast
    • dynamic_cast只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。
      • 不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象;检测在运行时进行。
      • 如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL
      • 如果一个引用类型执行了类型转换并且这个转换是不可能的,一个bad_cast的异常类型被抛出
  • const_cast
    • 一般用于强制消除对象的常量性。它是唯一能做到这一点的 C++ 风格的强制转型。
    • 其它三种操作符是不能修改一个对象的常量性的。
    • 注意:const_cast也能改变一个类型的volatile qualifier。

@Durant35
Copy link
Owner Author

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant