显式类型转换函数

实战指南 | IC模拟版图设计从零到精通,手把手带你掌握EDA工具与GDSII输出 本文提供了一份从零开始的IC模拟版图设计实战指南。详细介绍了如何搭建Linux环境、安装Cadence Virtuoso等EDA工具,并深入解析了PDK设计规则。通过手把手绘制CMOS反相器版图的实例,系统讲解了版图绘制、DRC/LVS验证、寄生参数提取、匹配设计以及ESD防护等核心技能,最终指导如何正确生成交付芯片制造厂的标准GDSII文件,帮助读者掌握完整的模拟版图设计流程。 阅读详情

显式类型转换函数

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

(T) expression // cast expression to be of type T

函数风格(Function-style)强制转型使用这样的语法:
T(expression) // cast expression to be of type T

这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我把这两种形式称为旧风格(old-style)的强制转型

 

二、C++ style

旧风格的强制转型依然合法,但是新的形式更可取。首先,在代码中它们更容易识别(无论是人还是像 grep 这样的工具都是如此),这样就简化了在代码中寻找类型系统被破坏的地方的过程。第二,更精确地指定每一个强制转型的目的,使得编译器诊断使用错误成为可能。例如,如果你试图使用一个 const_cast 以外的新风格强制转型来消除常量性,你的代码将无法编译。

 

2.1 四个函数概述

C++的四种强制转型形式:
dynamic_cast:
动态类型转换  
static_cast:
静态类型转换
 
reinterpret_cast:
重新解释类型转换
 
const_cast:
常量类型转换  

 

static_cast

用法:static_cast < type > ( expression )
该运算符把expression转换为type类型,但没有运行时类型检查来保证转换的安全性。

一般是普通数据类型(如int m=static_cast<int>(3.14));在相关的指针类型或对象之间进行类型转换,在转换时编译器会通过构造函数或转换类型函数转换关系。

static_cast 可以被用于强制隐型转换(例如,non-const 对象转型为 const 对象,int 转型为 double,等等),它还可以用于很多这样的转换的反向转换(例如,void* 指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个 const 对象转型为 non-const 对象(只有 const_cast 能做到),它最接近于C-style的转换。

 

它主要有如下几种用法:
①
用于类层次结构中基类和子类之间指针或引用的转换。
  进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
  进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

class B { ... };   

class D : public B { ... };   

void f(B* pb, D* pd)   

{   

   D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指针   

   B* pb2 = static_cast<B*>(pd);        // 安全的   

}
②
用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③
把空指针转换成目标类型的空指针。
④
把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

 

static_cast允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的)
应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。
在这例子里,被转换的父类没有被检查是否与目的类型相一致。
class Base {};
class Derived : public Base {};

Base *a    = new Base;
Derived *b = static_cast<Derived *>(a);
'static_cast'
除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换,在可以适用使用标准转换运算符的地方都可以适用static_cast运算符。

double d = 3.14159265;
int    i = static_cast<int>(d);

int i=0;

double d = static_cast<double>(i);

int j = static_cast<int>(d);

 

还有:
class A
{
 protected:
    int m_x;
    char *m_username;
 public :
    A(int x) { m_x=x; }
    A(char *username)

 {
        m_username=new char[strlen(username)+1];
        strcpy(m_username, username);    
    }
   operater int () {  return m_x; }
   operator char *() const  { return m_username; }
}
A a(2);
int x=static_cast<int>(a);
char *p=static_cast<const char *>(a);
注意:这些static_cast运算符能够正常使用的原因只有一个:类A支持运算符int, const char *的overload.否则就和使用标准转换运算符一样是无用的。一般来说,static_cast很少用于指针转换。例如

    int *px;
    double y=2.2;
    px=static_cast<int *>(&y);  //syntax error, can not convert double * to int *
//
可以这样理解,static_cast一般用于不同类型的数据的转换,而不能用于转换指针。而reinterpret_cast正好相反,其只能负责不同类型的指针转换。

 

dynamic_cast

一般用在父类和子类指针或引用的互相转化,如果启动了支持运行进类型信息RTTI)可以有助于判断在运行时所指向的对象的确切类型。注:vc++默认式禁止RTTI信息的,若开启,需在工程-》设置,在 c++选项中,选c++语言,勾上“允许运行时类型信息RTTI".

用法:dynamic_cast < type-id > ( expression )

该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

dynamic_cast 主要用于执行“安全的向下转型(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制转型,也是唯一可能有重大运行时代价的强制转型。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

class B{
public:
    int m_iNum;
    virtual void foo();

};

class D:public B{
public:
    char *m_szName[100]
;

      void print() { cout << "D:print()" << endl; };

};

void func(B *pb){
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);

  pd2->print();

  pd2->m_szName[0]=’a’; // error

  pd1->m_szName[0]=’a’; //right;

}

在上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;
但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针(
检测在运行时进行,如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。dynamic_cast是一种试探性映射,如果类型T不是a的某个基类型,该操作将返回一个空指针。为空了还能执行print(),解释:C++对类成员函数只有一份拷贝,编译器只要知道了是哪个类就可以调用其成员函数,但是每个类对象的成员变量是分开存储的,所以如果调用了成员变量的话应该就会报错了)。
另外要注意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。

'dynamic_cast'只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程)。static_cast通常可用于类层次的静态导航,无映射变换,窄化变换(会丢失信息)等等,static_cast的应用要广一些,但如前所提到的,在类层次导航变换中我们应该使用前者,因为后者static_cast可能意味着冒险(比如变换时类似于强制转换一样丢失信息)。在某些情况下较dynamic_cast快.

另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。
class A{
 public:
    int m_iNum;
    virtual void f(){}

};
class B:public A{ };
class D:public A{ };

B *pb = new B;
pb->m_iNum = 100;
D *pd1 = static_cast(pb); //compile error
D *pd2 = dynamic_cast(pb); //pd2 is NULL
delete pb;

使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。

reinterpret_cast

很像c的一般类型转换操作,是最危险的,只要编译通过就行,使用不当的话很有可能导致RUN-TIME大灾难. 是强制转换,而不论是否提供了相应构造函数或转换类型数,因此,在转换时其内存格式并不变化,例如,当对double转换成int后,通过cout输出时,输出的仍然是double类型,其主要目的是:将一个指针转换成其它类型的指针。这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。
    reinterpret_cast
是特意用于底层的强制转型,导致实现依赖(implementation-dependent)(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制转型在底层代码以外应该极为罕见。

class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);
'reinterpret_cast'
就像传统的类型转换一样对待所有指针的类型转换。


const_cast

是把cosnt或volatile属性去掉,const_cast 一般用于强制消除对象的常量性。去除常量变量的常量属性,或反之将非常量的指针变量转换成常指针变量。

   const int x=12;
    int *px=x; //syntax error, int pointer can not point to const int
可以改为:
    const int x=12;
    int *px=const_cast<int *>(&x);
    *px=20;//ok 
//x
值没有变化!!!!也不能x = 5;


又例如:
class Account
{
   int balance;
 public:
    Account(int b) { balance=b; }
    void operater +=(int newbalance) { balance+=newbalance; }
 }
const Account a(9000);
Account *pa=&a;//syntax error!
*pa+=1000;//syntax error!
可以改为:
const Account a(9000);
Account *pa=const_cast<Account *>(&a);
*pa+=1000;
这样的话 const对象a 的balance就变为10000了!!

总的来说,const_cast的主要作用之一是去掉const保护。因此少用为好。

DSP2837X CLA开发实战教程 摘要: 本文详细解析TI C2000 DSP中CLA协处理器的开发流程,以TMS320F28377D的cla_divide案例为例,展示浮点除法验证的实现方法。从基础配置(消息RAM管理、任务触发)到高级调试(ePWM计时、断点设置),涵盖全流程开发要点。重点分析CLA编程约束(禁用标准库、数学优化)、多任务调度及常见问题解决方案(如死锁、数据同步)。提供FPGA协同加速、电机控制等扩展方向,并推荐官方例程与硬件平台(如创龙TL2837xF-EVM)。开发时需注意.cla文件语法支持及调试技巧,以充分发挥C 阅读详情

相关推荐

PPPoE上网配置不求人:华为路由器命令行操作指南(2023最新版)

本文提供2023年最新的华为路由器PPPoE上网配置命令行操作指南。通过详细的步骤讲解,从连接设备、创建拨号接口、绑定PPPoE客户端到配置内网与NAT,手把手教你完成配置,并附有验证排错方法,助你轻松实现稳定上网。

s4t5u6v的博客 682

C++面向对象——类型转换构造函数(显/隐式)

//显式类型转换构造函数 #include &lt;iostream&gt; using namespace std; class Complex{ public: double real, imag; explicit Complex(int i){ //显式类型转换构造函数 cout &lt;&lt; "IntConstructor called" &lt;...

graceful_tomorrow的博客 445

UVM入门与进阶学习笔记17——寄存器模型(3)

目录寄存器模型的常规方法mirror、desired和actual valueprediction的分类自动预测显式预测uvm_reg的访问方法mem与reg的联系和差别内建(built-in)sequences寄存器模型内建序列存储模型内建序列寄存器健康检查寄存器应用场景寄存器检查功能覆盖率概述覆盖率自动收集模式覆盖率外部事件触发收集 寄存器模型的常规方法 mirror、desired和actual value 在应用寄存器模型时,除了利用它的寄存器信息,也会利用它跟踪寄存器的值。 寄存器模型中的每

weixin_41979380的博客 7538

C++模板与泛型编程:模板实参推断 (类型转换与模板类型实参、函数模板显式实参、尾置返回类型与类型转换、函数指针和实参推断)

文章目录模板实参推断类型转换与模板类型实参使用相同模板参数类型的函数形参正常类型转换应用于普通函数实参函数模板显式实参指定显式模板实参正常类型转换应用于显式指定的实参尾置返回类型与类型转换进行类型转换的标准库模板类函数指针和实参推断 模板实参推断 ​ 我们知道,对于函数模板,编译器利用调用中的函数实参来确定其模板参数。从函数实参来确定模板实参的过程被称为模板实参推断。在模板实参推断过程中,编译器使...

Error Man 的博客 823

【黑马-产品经理入门基础课笔记】01.认识产品经理

问题定义 ==> 可行性研究 ==> 需求分析。

2401_88466092的博客 1844

一种独特机理驱动的化学反应分类器详解

代码位置第 47-300+ 行// atom_494: 硫原子,度数=2,化合价=2,无H,无电荷!// atom_35: 氧原子,度数=1,1个H,无电荷// atom_347: 氧原子,度数=2,无H,无电荷!→atom_494()[OD1h1+0]→atom_35()→atom_347()特性传统方法(MCS)NameRXN(机理驱动)匹配策略最大公共子结构原子类型模式 + 操作码时间复杂度O(n) - 线性扫描机理理解无内置化学机理原子映射需额外计算自动推导准确性结构相似。

ASKCOS博客 160

构造函数创建隐式对象作为参数 / 使用函数表示法的显式类型转换

看个构造函数创建隐式对象作为参数的例子 #include&lt;iostream&gt; using namespace std; class A { int a; int b; public: A() { cout &lt;&lt; "构造函数" &lt;&lt; endl; }; A(int, int) { cout &lt;&lt; "int构造函数" &lt;&lt;

Jeff_的博客 666

高通MBIM拨号流程简述

高通平台MBIM流程简述

不秃头的程序猿Gabriel的博客 5071

mysql之类型转换函数

类型转换函数 类型转换函数和case函数 1.隐式类型转换和显式类型转换的概念 隐式类型装换: 两个值进行运算或者比较,首先要求数据类型必须一致。如果发现两个数据类型不一致时就会发生隐式类型转换。例如,把字符串转成数字,或者相反: SELECT 1+‘1’; – 字符串1转成数字 SELECT concat(2,’ test’); – 数字2转成字符串 显式类型转换: 利用函数进行数据类型...

weixin_42373127的博客 3万+

【Android 11】使用Android Studio调试系统应用之Settings移植(三):构建Settings、SettingsLib项目文件

基于android 11,本系列文章力争实用,讲解使用AS调试系统app的方法,并提供了配套源下载,供学习调试。上一篇文章[Android 11]使用Android Studio调试系统应用(二):依赖分析、android.bp、静态和动态依赖,讲解了如何搭建编译服务器,如何下载AOSP源码,如何切换到AOSP的指定分支(android-11-r39),以及如何编译、解决编译错误、运行模拟器,本文将开始讲解如何构建Settings的AS工程文件! 走过、路过,有用过的同学,记得给个赞O(∩_∩)O哈!

上周的博客 2688

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1892

谈谈MySQL显式类型转换

本文首发于个人微信公众号《andyqian》,期待您的关注! 前言   我们之前谈了《谈谈MySQL隐式类型转换》,今天我们来说说MySQL显示类型转换。其实我们之前有简单说过一次,这次主要是掰开揉细了说。 CAST 函数   在之前的文章中,我们提到过CAST函数,用于显示进行类型转换。在避免隐式类型转换时,好处多多。其实这里面还有很多细节,是需要梳理下的。 首先来看看下面这个

划不出的界限 1303

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1167

在 C++ 中使用显式关键字

C++ 中的显式关键字用于标记构造函数以不隐式转换 C++ 中的类型。对于只接受一个参数并适用于构造函数(带有单个参数)的构造函数,它是可选的,因为它们是唯一可用于类型转换的构造函数。 让我们通过一个例子来理解显式关键字。 预测以下 C++ 程序的输出 // CPP Program to illustrate default // constructor without 'explicit' // keyword #include <iostream> using namespace std;

552

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++类型转换函数

显示转换 隐式转换

qq_43003442的博客 176

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

调用构造函数进行类型转换(显式和隐式)

代码示例 1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A(int x){ i = x; cout << "构造函数执行!" << i << endl; }//可以关键字explicit用来禁止隐式转换,然而显式转换还可...

weixin_30745553的博客 262

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【C++快速上手】二十、explicit(显式)关键字学习笔记(待完善)

explicit 修饰构造函数时,可以防止隐式转换和复制初始化 explicit 修饰转换函数时,可以防止隐式转换,但按语境转换除外 参考 explicit(显式)关键字那些事

悟已往之不谏 知来者之可追 553

显式/隐式类型转换/初始化

隐式和显式初始化 a) C++隐式初始化 int ival(1024); string hello("hello rookie"); b) C++显式初始化 int val = 1024 string hello = "hello rookie" *这里的“=”语法是拷贝构造函数,而不是赋值运算。 因为一个新对象被定义一定要有一个构造函数而不是一个赋值操作 string hello; hell...

weixin_44572041的博客 1083

11.6 类的自动转换和强制类型转换

类型转换 将一个标准类型变量的值赋值给另一种标准类型的变量时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型。 long count = 8; //int类型转换为long类型 double time = 11; //int类型转换为double类型 int side = 3.33; //double类型转换为int类型 在C++各种数值类型都表示相同的东西,一个数字,同时C++包含用于进行转换的内置规则。 C++语言不自动转换不兼容的类型: int *p = 10; //错误 左边是指针

qq_36314864的博客 856

【C#】通用类型转换

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。

视觉软件 1017

5、类型转换构造函数

1、类型转换构造函数的概念 类型转换构造函数是这样一种构造函数:它只有一个参数,而且它不是属于复制构造函数的构造函数,一般就可以把它看作是转换构造函数。 2、类型转换构造函数的作用 定义转换构造函数的目的是实现类型的自动转换。 当需要的时候,编译系统会自动调用转换构造函数,建立 一个无名的临时对象(或临时变量)。 3、类型转换构造函数什么时候被调用? (1)发生在初始化语句。 上述情况是指在定...

江南又一春 4433

QD1-45 JS 类型转换(3)显式转换

介绍 JavaScript 显示类型转换

qq_38641599的博客 461

显式类型转换和隐式类型转换,python代码

在 Python 中,类型转换分为显式类型转换和隐式类型转换。 显式类型转换指的是使用内置函数或自定义函数显式地将一种类型转换为另一种类型。例如,可以使用 int() 函数将字符串转换为整数: x ="123" y = int(x) # y 的类型为 int print(y) # 输出 123 隐式类型转换指的是在执行运算时,Python 会自动将变量转换为适当的类型。例如,在执行整数除法运...

weixin_35751194的博客 526

C++函数模板与普通函数调用优先级解析:精确匹配、类型转换与显式控制

在C++泛型编程中,函数重载与模板是提升代码复用性和灵活性的核心机制。其原理基于编译器的名称查找与重载决议两阶段过程,编译器会收集所有同名候选函数,并根据实参与形参的匹配质量进行排序。技术价值在于,它允许开发者编写类型无关的通用算法,同时通过特化或重载为特定类型提供优化实现,从而兼顾效率与通用性。应用场景广泛,从实现类型安全的容器操作到构建如标准库中`std::swap`这样的通用工具。本文聚焦于当普通函数与函数模板共存时,编译器如何抉择:普通函数在精确匹配时优先;若模板能产生更优匹配(避免不必要的类型转换

weixin_34293141的博客 389

`sqrt` 函数和类型转换的详细总结

在 C++ 中,类型转换用于将一种数据类型转换为另一种数据类型。函数用于计算平方根,而类型转换则是将一种数据类型转换为另一种数据类型。函数和类型转换,可以灵活地处理数值计算和类型转换的需求。:计算一个数的平方根。

2301_80093604的博客 759

类型转换【C++提升】(隐式转换、显式转换、自定义转换、转换构造函数、转换运算符重载......你想知道的全都有)

C++是一种强类型语言,其类型转换机制非常重要。类型转换使得不同数据类型之间可以相互转换,以满足程序的灵活性和可操作性。本文即将探讨的C++中的类型转换内容主要包括:基本类型转换,隐式类型转换,显式类型转换和自定义类型转换等内容

Stark的博客 1426
上一篇: delete free
下一篇: 虚函数表
proing
博客等级 码龄19年 2092粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值