当前位置: 首页 > news >正文

龙岩做网站龙岩网页设计/百度教育官网

龙岩做网站龙岩网页设计,百度教育官网,英文公司网站,一键生成logo的网站xxx_cast本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。 名词解释 explicit / implicit隐式类型转换 C类型(char,int,float,long,double等)…
xxx_cast

本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。

  • 名词解释
    • explicit / implicit
    • 隐式类型转换
      • C++类型(char,int,float,long,double等)的隐式转换
      • C++类对象的隐式转换
    • 显式转换
      • C++类型(char,int,float,long,double等)的显式转换
      • C++类对象的显式转换
  • reinterpret_cast
  • const_cast
  • static_cast
  • dynamic_cast
  • 小结
  • 参考资料

C 风格(C-style)强制转型如下:

(T) expression  或
T(expression) //函数风格(Function-style)

两种形式之间没有本质上的不同。
对于具有转换的简单类型而言C 风格转型工作得很好。然而,这样的转换符也能不分皂白地应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:einterpret_cast, static_cast, dynamic_cast和const_cast,目的在于控制类(class)之间的类型转换。

名词解释

explicit / implicit

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).

隐式类型转换

隐式转换是系统跟据程序的需要而自动转换的。

C++类型(char,int,float,long,double等)的隐式转换

算术表达式隐式转换顺序为:

  1. char - int - long - double
  2. float - double
//1)算术表达式
int m = 10;
double n = m;//n = 10.0;隐式把m转为double类型int m = 10;
float f = 10.0;
double d = m + f;//n = 20.0;隐式把m和f转为double类型//2)赋值
int *p = NULL; //NULL(0)隐式转换为int*类型的空指针值//3)函数入参
float add(float f);  
add(2); //2隐式转换为float类型//4)函数返回值
double minus(int a, int b) 
{  return a - b; //返回值隐式转换为double类型
}

C++类对象的隐式转换

void fun(CTest test); class CTest 
{ 
public: CTest(int m = 0); 
} 
fun(20);//隐式转换

显式转换

显式转换也叫强制转换/静态转换,是自己主动让这个类型转换成别的类型。

C++类型(char,int,float,long,double等)的显式转换

int m = 5;
char c = (char)m;//显式把m转为char类型double d = 2.0;
int i = 1;
i += static_cast<int>(d);//显式把d转换为int类型

C++类对象的显式转换

当类构造函数只有一个参数或除了第一个参数外其余参数都有默认值时,则此类有隐含的类型转换操作符(隐式转换),但有时隐式转换并不是我们想要的,可在构造函数前加上关键字explicit,来指定显式调用。

void fun(CTest test); class CTest 
{ 
public: explicit CTest(int m = 0); 
} 
fun(20);//error 隐式转换
fun(static_cast<CTest>(20)); //ok 显式转换

reinterpret_cast

用法:

reinterpret_cast<type-id> (expression)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。
这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。reinpreter_cast是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果。

int n=9;
// reinterpret_cast 仅仅是复制 n 的比特位到 d,因此d 包含无用值。double d=reinterpret_cast<double & > (n);

const_cast

用法:

const_cast<type_id> (expression)

用于修改类型的const或volatile属性。除了const 或volatile修饰之外,type_id和expression的类型是一样的,一般用于强制消除对象的常量性。它是唯一能做到这一点的 C++ 风格的强制转型,而C不提供消除const的机制(已验证)。
常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

static_cast

用法:

static_cast < type-id > ( expression )

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它允许执行任意的隐式转换和相反转换动作。主要有如下几种用法:

1)用于基本数据类型之间的转换,如把int转换成char,non-const 对象转型为 const 对象(这里相反方向不可以,C++只有const_cast可以)。
2)把空指针转换成目标类型的指针。(之前的做法是用强制转换(type-id*))
3)把任何类型的表达式转换成void类型。
4)应用到类的指针上,它允许子类类型的指针转换为父类类型的指针(upercasting这是一个有效的隐式转换);也能够执行相反动作,即转换父类为它的子类(downcasting),这种转换的安全性需要开发人员来保证(主要是在非上下转型中)。
class Base {};
class Derived : public Base {};
Base *a = new Base;
Derived *b = NULL;
b = static_cast<Derived *>(a); //可以通过编译,但存在安全隐患(如访问//Derived的成员)

注意:
1.static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
2.在非基本类型或上下转型中,被转换的父类需要检查是否与目的类型相一致,否则,如果在两个完全不相干的类之间进行转换,将会导致编译出错。

dynamic_cast

只用于对象的指针和引用,主要用于执行“安全的向下转型”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制转型,也是唯一可能有重大运行时代价的强制转型。
当用于多态类型时(包含虚函数),它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(即隐式转换的相反过程),dynamic_cast根据RTTI信息检查操作是否有效。即在转换时dynamic_cast会检查转换是否能返回一个被请求的有效的完整对象。这种检查不是语法上的,而是真实情况的检查。检测在运行时进行,如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。
先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也就意味着,如果基类没有虚函数,也就无法判断一个基类指针变量所指对象的真实类型, 这时候dynamic_cast只能用来做安全的转换(upercasting),如从派生类指针转换成基类指针,而这种转换其实并不需要dynamic_cast参与。

class Base { virtual dummy() {} };
class Derived : public Base {};
class Other{} ;
Base* b1 = new Derived;
Base* b2 = new Base;
Derived* d1 = dynamic_cast<Derived *>(b1);  // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2);  // fails: returns 'NULL'
//如果一个引用类型执行了类型转换并且这个转换是不可能的,运行时一个//bad_cast的异常类型会被抛出:
Derived d3 = dynamic_cast<Derived &>(*b1);  // succeeds
Derived d4 = dynamic_cast<Derived &>(*b2);  // fails: exception thrown

注意:Base需要有虚函数,否则会编译出错。

小结

四种类型转换操作符对于隐式的类型转换没有必要。
static_cast在更宽上范围内可以完成映射,这种不加限制的映射伴随着不安全性。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时(基类需要包含虚函数),dynamic_cast具有类型检查的功能,牺牲了效率,但比static_cast安全。

参考资料

C++ explicit关键字详解
隐式转换和静态转换
C++隐式转换和显示转换
C++ 隐式转换和显示转换
C++ xxx_cast实现转换代码实例解析
C++四种cast操作符

http://www.jmfq.cn/news/5261851.html

相关文章:

  • 网站日历插件/seo包年优化费用
  • 服务器怎样做网站呢/广东优化疫情防控措施
  • 河北企业建网站/网站建设的一般步骤
  • jquery 做网站/百度统计api
  • 东营网站建设培训学校/舆情管理
  • 做公司网站都需要什么资料/跨境电商平台注册开店流程
  • 做网站的股哥/运营seo是什么意思
  • 网站跟app的区别/中公教育培训机构官网
  • 做网站公司的出路/百度知道合伙人官网登录入口
  • 广东外贸网站开发/seo算法优化
  • 小型网站设计及建设论文范本/培训中心
  • 永兴网站开发/网页制作培训网站
  • 抖音视频添加小程序怎么赚钱/武汉seo招聘
  • 网站建设开发合同模板/宣传推广方案范文
  • 找人建设一个网站大概需要多少费用/网站建设规划要点详解
  • 网站建设公司怎么找业务/重庆企业网站排名优化
  • 网络营销与策划实践报告/长沙网站优化公司
  • 卡盟做网站/seo是什么缩写
  • 网站文章百度快照怎么做/免费投放广告的平台
  • 网站的内容与功能设计/2020年可用好用的搜索引擎
  • 网站建设分析从哪几个方面/电商培训机构排名前十
  • 网站建设运动会成绩管理系统/百度的网址是多少
  • 第一推是谁做的网站/seo诊断网站
  • 做seo要明白网站内/整站seo技术
  • golang web网站开发/seo查询 站长工具
  • 台州企业网站搭建电话/贵州seo技术查询
  • 宿豫区建设局网站/公司推广方法有哪些
  • 音乐网站怎么做无线增值业务/企业网站怎么优化
  • 如何提高网站用户体验/百度数据查询
  • 专业做网文的网站好/怎么去推广自己的公司