C++编译与运行:其一、静态类型和动态类型

这篇具有很好参考价值的文章主要介绍了C++编译与运行:其一、静态类型和动态类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是静态类型和动态类型?

先说结论:编译期间可以明确的类型是静态类型;运行期间才能明确的类型是动态类型。
后半句可能有点不好理解,通俗地说,需要通过执行代码才能明确的类型是动态类型。

假如我们有两个类,分别是基类A,和派生类B。

A a;   //静态类型
A * p = new B;   //动态类型

第一行,编译的时候编译器就知道了,a的类型是A,所以是静态绑定。
第二行,难道编译的时候,编译器不知道p指向的是B类型的对象吗?抱歉,真的不知道。因为编译过程中,不会执行代码。根据前文的讲解,new B这个过程其实执行了多个函数,所以不会发生在编译过程中,p也就不知道自己到底指向的是什么类型。只有在运行过程中,才知道指向的对象类型是B。当然编译器会提前做一些校验,假如A和B不存在继承关系,那么编译自然会报错。

规范化的说法:
静态类型:对象在声明时采用的类型,在编译期既已确定;
动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的。

二、什么是静态绑定和动态绑定?

什么是绑定?
把一个方法与类对象关联起来的方法叫绑定。
C++ 程序在运行前需要经过编译阶段,编译时编译器会为代码中的各种变量(static、全局变量等)及代码块(函数)分配存储空间,同时把函数翻译成机器能识别的二进制机器码及完成一些函数跳转动作等。在有虚函数的类中,编译器会给每个类分配一块虚函数表,虚函数表里存放的是虚函数地址。程序运行时,实例化类对象时,对象内存的第一块区域(8 字节)存放了一个虚表指针,该指针指向了该类所拥有的虚函数表。

静态绑定,又叫前期绑定,指在程序运行前就已经知道方法是属于哪个类的,在编译期间就可以链接到类中,定位到这个方法。静态绑定发生于编译器,因此不能利用任何运行期的信息。

动态绑定是指在程序运行过程中,根据具体的实例对象才能具体确定是调用了哪个方法。也就是说,动态绑定只能用到运行期的可用信息。
转自知乎:C++静态绑定和动态绑定
在网上的绝大多数教程中,基本都是用指针+虚函数解释动态绑定。其实指针不是必须的,我们在后面的博客中可以看到具体例子。文章来源地址https://www.toymoban.com/news/detail-718488.html

到了这里,关于C++编译与运行:其一、静态类型和动态类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 小程序应用&解包反编译&动态调试&抓包&静态分析&源码架构

    小程序应用&解包反编译&动态调试&抓包&静态分析&源码架构

    直接在微信小程序上搜就完了 参考地址:https://blog.csdn.net/m0_60571842/article/details/132564881 反编译之后就会得到源码,然后对源码架构进行分析以下4个方面 1.更多的资产信息 2.敏感的配置信息 3.未授权访问测试 4.源码中的安全问题 小程序多功能组手 简单工具:http://xcx.

    2024年02月05日
    浏览(11)
  • 为了简写这行代码,我竟使用静态和动态编译技术

    为了简写这行代码,我竟使用静态和动态编译技术

    在我们系统中有这么一个需求,业务方会通过mq将一些用户信息传给我们,我们的服务处理完后,再将信息转发给子系统。mq的内容如下: 主要分为两部分,第一部分是用户id,这部分用于唯一标识一个用户,不会改变。第二部分是一些基础信息,账单、订单、联系方式、地址

    2024年02月07日
    浏览(8)
  • 【Linux】静态库与动态库制作及运行原理

    【Linux】静态库与动态库制作及运行原理

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 先来总体描述下静态库与动态库的区别. 静态库是将头文件总体复制到可执行文件当中 。 动态库是在可执行程序运行时进行了动态链接 (所需要某个实现方法就去内存中查找). 所

    2024年02月05日
    浏览(8)
  • 静态curl库编译与使用(c++)

    静态curl库编译与使用:mingw https://curl.se/windows/ // 测试:设置URL地址 // curl_easy_setopt(curlHandle, CURLOPT_URL, “https://ipinfo.io/json”); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0L); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, 0L);

    2024年02月19日
    浏览(7)
  • Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    1.首先认识一下NDK。 (1)什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,

    2024年02月11日
    浏览(12)
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(26)
  • 关于不同版本VS编译获得的静态库、动态库的兼容性

    看了上一篇博客还是在6月13号,一直想着写一些东西,也准备了很多内容,没想到一直拖到了现在。今天终于掀开了我的笔记本盖子,按下了开机按钮,双击浏览器图标打开了博客页(浏览器图标都差点找不到了~~),赶紧写完一篇睡觉,明晚还要给我的小可爱做饭呢。。。

    2024年02月05日
    浏览(7)
  • Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习

    Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习

    gcc -S test.i -o test.s//-S 的作用是编译结束生成汇编文件。 汇编阶段 汇编阶段把 .S 文件翻译成二进制机器指令文件 .o ,这个阶段接收.c ,.i ,.s 的文件都没有问题。 下面我们通过以下命令生成二进制机器指令文件 .o 文件: gcc -c test.s -o test.o 链接阶段 链接阶段,链接的是函数库。

    2024年04月09日
    浏览(14)
  • Day18:信息打点-小程序应用&解包反编译&动态调试&抓包&静态分析&源码架构

    Day18:信息打点-小程序应用&解包反编译&动态调试&抓包&静态分析&源码架构

    目录 小程序获取-各大平台搜索 小程序体验-凡科建站模版测试上线 小程序抓包-ProxifierBurpSuite联动 小程序逆向-解包反编译动态调试架构 思维导图 章节知识点 Web:语言 / CMS / 中间件 / 数据库 / 系统 / WAF 等 系统:操作系统 / 端口服务 / 网络环境 / 防火墙等 应用: APP

    2024年04月09日
    浏览(13)
  • C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用

    C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用

    来看代码 但是会报错,说引用错误。 这是因为把computePosition函数定义为 static 引起的。 解决办法: computePosition函数定义为 static 不能更改了(我的代码需求,static必须存在),所以要在它内部使用,需要把其它函数也改成静态的。 更改如下: 关于.cpp文件那两行应该放在哪

    2024年02月09日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包