首页 > 其他分享 >第一章 类型与对象

第一章 类型与对象

时间:2023-06-29 23:12:46浏览次数:45  
标签:语言 对象 C++ 第一章 引入 类型 指针

        在编程语言中通常会有类型的概念,我们所使用的C++也不例外,其为静态类型(与之对应的是动态类型,对象的类型在运行时确定,其类型也可以动态改变)系统,所有对象、变量(包括常量)都得在编译时确定类型,并确定后该对象、变量的类型将不能改变。

  静态类型在编译时已确定,其是固定的;而对象是个运行时概念,其是灵活的。一旦程序运行后,就没什么类型的概念了。那么我们为何还需要类型呢?

1.1类型的作用

  C语言解决了B语言存在的一个严重的问题----类型问题。最初B语言是按字长取址,其运行机器也比较简单,那时候语言的唯一数据类型为word或者cell。当时还没有类型的概念,只是存储数据的一个单位罢了。直到PDP-11计算机的出现暴漏了B语言模型的不足之处。

  首先,它不适合处理单字节。需要将字节打包到cell上,而且读写时涉及重组这些cell;其次,PDP-11计算机支持浮点运算,B语言为了支持浮点运算引入特殊的操作符,而这些操作符是硬件相关的,最后是B语言对指针处理有额外的开销,指针作为数组的索引,需要运行时调整数组的下标才能被硬件所接受。从这些问题里可以看出类型系统的重要性,它可以让编译器生成正确指令以及对应数据的存储方式。

  后来类型系统的重要性更多体现在类型安全、类型检查上。类型不仅能够给数据赋予意义,还能充当接口,对行为进行约束。做一个让大量的猴子编写程序的思想实验,每个猴子每次随机敲下键盘的按键,然后编译、运行。

  如果这些猴子采用的是机器语言,那么每个字节的组合都可能被图灵机解释并执行,只不过这样的执行结果将毫无意义。而高级语言(例如C++语言)有自己的词法、语法规则,输入的字节组合能够被编译器检查,那么凭借这样的功能在运行前能拦住很多无意义的字节组合,最终可运行的程序或多或少都有意义。例如定义了一个“人”的类型,那么其对象的运行过程中不会变成狗,也不会飞。

  这里的类型检查就能阻止很多无意义的程序,与动态类型语言相比,在运行时所检查出的因类型而引发的错误都能够在编译时发现,这能节省很多程序调试的时间,软件开发过程中往往涉及重构,这些重构可以在保证功能不变的情况下,使得软件的可维护性更好。静态类型语言在重构后能及时发现类型错误,例如通过重构函数的形参类型,在编译时便能找出所有调用者,从而避免了遗漏。有些观点是在动态类型语言中通过添加大量测试来避免了因为类型问题而导致的错误,而测试本身往往是非确定性的,是个证伪的过程。当然仅通过类型系统是不可能完全保证程序的正确性,但至少在一定程度上保证程序的正确性。

1.2 现代C++中对类型处理能力的演进

  C++在演进过程中逐渐增强和扩展了对类型处理的能力。

  在C++11中引入了右值引用,从而重新定义值类别(value category)来对表达式进行分类,右值引用能够表达移动语义,解决了传统C++产生的中间临时对象需要多次拷贝的问题;引入了强枚举类型特性,约束了枚举值的域,同时不允许隐式转换为数值类型,也不允许不同枚举类型之间比较。相对普通枚举类型来说能够避免一些意外的bug;放松了对union特性的约束,使其能够与非平凡类组合,增强了实用性;引入了auto关键字,对初始化变量进行类型推导,减轻了程序员需要手写复杂类型(诸如迭代器类型)的负担;引入了decltype特性,通过已有对象、变量获取其类型,解决了难以声明一个对象的类型(诸如lambda对象类型)的问题;引入了nullptr_t类型,避免了整数类型与指针问题导致的重载歧义问题。

  在C++17中引入了optional类型来表达一个对象是否存在的概念;引入了variant作为类型安全的union,使这些类型的表达更容易、更正确。

  在C++20中引入concept特性来对类型做约束,如此无论是从代码角度上,还是从编译错误信息的角度上,都更加可读。

  由C++标准委员会维护的C++ Core Guidelines里也针对类型提出了很多有启发性的建议,同时提供GSL基础库用于支撑这些指导方针,它是相当轻量的基础库,实现了遵循零成本的抽象原则。一些建议,例如C语言风格接口void f(T*, int),需要同时传递指针与其长度信息。若用区间类型gsl::span<T>代替前者即 void f(gsl::span<T>),则会更加友好;如果能够保证函数通过指针传递的参数非空,那么与其每次都用 void f(T*),对指针进行判空,不如将接口设计成 void f(gsl::not_-null<T*>)。

1.3 值类别

标签:语言,对象,C++,第一章,引入,类型,指针
From: https://www.cnblogs.com/Super-biscuits/p/17515430.html

相关文章

  • 基于粒子群算法的电力系统最优潮流 以IEEE30节点的六机为对象,建立考虑功率平衡、机组
    基于粒子群算法的电力系统最优潮流以IEEE30节点的六机为对象,建立考虑功率平衡、机组爬坡约束、出力限制约束的电力系统经济调度模型,采用粒子群算法对模型进行求解,得到六个机组的最优运行计划,确定系统最优运行成本。这段程序主要是一个基于粒子群优化算法(PSO)的电力系统调度程序。......
  • Kubernetes 对象以及部署nginx服务示例(四)
    什么是Kubernetes对象?在k8s中管理员与平台交互的最重要方式之一就是创建和管理Kubernetes对象,对象有助于帮助用户部署应用程序和维护集群。理解Kubernetes对象的另一种方法是将它们视为类实例。每个创建的对象都引用一个预定义的类,该类告诉apiserver如何处理系统资源并......
  • Python面向对象之元类
    Python面向对象之元类【一】前言引入千万不要被所谓“元类是99%的python程序员不会用到的特性”这类的说辞吓住。因为每个中国人,都是天生的元类使用者我们引用太极的思想道生一,一生二,二生三,三生万物即我是谁?我从哪里来?我到哪里去?我们拿到Python中type就相当于我们......
  • 【C#/.NET】使用Automapper映射record类型
    ​        当使用Automapper进行对象映射时,通常我们会使用POCO(PlainOldCLRObject)类作为源对象和目标对象。然而,自从C#9引入了record类型,它们提供了更简洁、不可变的对象模型。我已经将项目的所有Dto都是用record类型,但是record类型还是有些需要注意的点,本文将介绍如......
  • 12. 强制类型转换
    目录1.Defination2.整数提升3.常用的算术转换1.Defination  即把数据类型转换成另一种数据类型,例如这么一种情况,你想把long类型的数据,保存成int类型数据,那么你就需要将其进行强制类型转换。可以使用强制类型转换运算符来把值显示的转换成另一种数据类型。(type_name)expr......
  • 面向对象,方法复习
    面向对象,方法复习面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么..面对过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过......
  • 2.c语言数据类型
    c语言数据类型如图:图中的单位为byte(字节),1byte=8bit.整形数据的存储都是以补码的形式存储的对于负数,进行以下的转换:如数-254,在存储该数时:先对其取绝对值在转换成二进制对二进制数取反加一即可。对于浮点数的存储,采用诸如下面的存储方式:3.14=0.314*......
  • C# 序列化大小写 序列化对象为大小写 JsonConvert.SerializeObject
    关于C#序列化Json对象框架:.Net插件:Newtonsoft.Json最近有人问我序列化对象还区分大小写?我当时心想我都是通过Bejson格式化然后转换为C#类然后直接复制。没有关心过序列化成什么大小写。因为这样的话可以保持一致。直到有人问我才自己研究了一下。如下:usingNewtonsoft.......
  • 怎么把具有树形父子结构的对象集合存到对应的树形父子结构表里呢
     可以采用如下步骤:创建一个Map,key是对象的id,value是对象本身。遍历对象集合,将对象及其所有子对象都添加到Map中。迭代Map中的对象,检测其父节点是否存在,存在则设置其父id。最后遍历Map中的所有对象,按照父id顺序插入数据库表中。具体......
  • 数据对象校验原理
    表单数据校验jquery-validationThejQueryValidationPluginprovidesdrop-invalidationforyourexistingforms,whilemakingallkindsofcustomizationstofityourapplicationreallyeasy.来自jquery-validation项目。大概就是提供嵌入式的方式去校验表单,灵活......