[C++系列] 74. 类型系统和类型安全

1. 类型系统

类型系统(type system) 是一门编程语言最核心也是最基础的部分。一门计算机语言无论基于何种编程范式,都必须首先对类型系统作出明确的定义。

类型系统用于定义如何将编程语言中的数值和表达式归为许多不同的类型,如何操作这些类型,这些类型如何互相作用。 在每一个编程语言中都有 一个特定的类型系统,保证程序的行为良好,并且排除违规的行为。例如,C++语言中的类型如下:

  • 数据类型: 一个数据值的类型,如int、bool、 char、 double 等。
  • 类: 一个对象的类型。
  • 模板: 一个类的类型。

类型系统在各种语言之间有非常大的不同,最主要的差异是编译阶段的类型检查以及执行阶段的操作实现方式。

1.1 强类型定义和弱类型定义语言

强类型定义语言(或者强类型语言): 在该类型语言中一旦一个变量被指定了某个数据类型,如果 不经过强制转换,那么它就永远是这个数据类型了。 例如,在 C/C++ 语言中,如果定义了个整型变量 n, 那么程序根本不可能将 n 当作字符串类型处理, 如 “hello” + n 是错误的。强类型语言通常只允许以不丢失信息为前提的自动类型转换(如果采用强制转换可能丢失信息r

弱类型定义语言(或者弱类型语言): 在该类型的语言中,在 定义变量时可以忽略数据类型。它与强类型定义语言相反,一个变量可以赋不同数据类型的值,如 JavaScript、PHP 就是弱类型定义语言。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效地避免许多错误。

关于强类型和弱类型语言标准有不同的观点,有的从程序错误类别的角度出发认为 C/C++ 是弱类型语言,这里采用上述大众化的观点,认为C/C++属于强类型语言。

1.2 动态类型语言和静态类型语言

静态类型语言:程序中的数据类型是在编译阶段检查的,大多数静态类型语言都要求在使用变量之前定义它们的数据类型。由于在编译时就能发现数据类型错误,因此通常能增强最终程序的可靠性,程序有比较高的执行效率。C/C++是静态类型语言的典型代表,静态类型语言还有C#、 Java等。

静态类型语言的优点:

  • 其程序结构非常规范,便于调试
  • 向编译器提供更多有用的类型检查信息,便于优化,例如,如果个类型指明其值必须以 4的倍数对齐,编译器就可以使用更有效率的机器指令
  • 另外,由于类型强制定义,很多静态类型语言提供了具有智能感知的集成开发环境,方便软件开发。

静态类型语言的缺点:

  • 静态类型语言为了达到多态性会采取一些类型鉴别手段, 如继承、接口等,所以缺点是为此需要编写更多的类型相关代码,导致不便于阅读、不清晰明了。

动态类型语言: 与静态类型语言刚好相反,动态类型语言是指在 执行期间才去做类型检查的语言。在动态类型语言中经常在执行阶段进行类型标记的检查,因为变量所约束的值可经由执行路径获得不同的标记。

动态类型语言的优点:

  • 用动态类型语言编程时人们不需要分心去考虑程序编程问题,而集中精力思考业务逻辑的实现

动态类型语言的缺点:

  • 动态类型语言却不需要这样做,但也有缺点,就是不方便调试当命名不规范时会造成读不懂、不利于理解等

动态类型语言并非一定是弱类型语言, 二者不是等价的,相反,动态类型语言一般都是强类型语言C++是一种强类型语言,也是一种静态类型语言。

2. 类型安全

类型安全在很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。

类型安全常被用来形容编程语言,其依据在于该门编程语言是否提供保障类型安全的机制:如果编程语言不允许导致错误的运算或转换,就认为该语言是类型安全的。 实际上,静态类型语言并非就是类型安全的,因为有多少的类型错误发生以及有多少比例的错误能被静态类型所捕捉仍有争论。另外,是不是动态类型语言与这门语言是不是类型安全的完全不相干,不要将它们联系在一起。

有的时候也用类型安全来形容某个程序,判别的标准在于该程序是否隐含类型错误。

类型安全的编程语言与类型安全的程序之间没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反,差一点儿的程序 员可能使用类型相当安全的语言写出类型不太安全的程序。目前暂时还没有绝对类型安全的编程语言。

C/C++语言在局部上下文中表现出类型安全,例如试图从种结构体的指针转 换成另一种结构体的指针时编译器将会报告错误,除非使用显式类型转换。相对而言,C比C++存在更多不安全的隐式转换操作。例如:

int main() {
    printf("%f\n", 10);
    return 0;
}

其中 %f 浮点数格式与整数 10 并不匹配。上述代码作为 C 程序可以编译通过,执行也没报错,但是输出结果却是 0.000000。上述代码作为 C++ 程序可以编译通过,但执行时出现程序崩溃(防止高版本的编辑器过度优化,请进行相关设置,或者在VC++ 6.0下可出现程序崩溃现象,否则将仍输出结果 0.000000)。

所以,C/C++都不是类型安全的语言。

3. C++ 和 C 差别 (类型系统角度分析)

从类型系统角度看,C++ 的类型系统包含 C 的类型系统,增加了类和模板类型,所以 C 是一种结构化编程语言,而 C++ 是面向对象的编程语言。

4. C++ 和 C 有什么不同 (品,细品)

就语言本身而言,C 是 C++ 的一个子集,C++ 在 C 的基础上增加了类和模板类型。一方面 C++ 加强了 C 的过程化功能,引入了重载、异常处理等,另一方面更是扩展了面向对象设计的内容。如类、友元、继承、虚函数和模板等。
从编程角度看, C 是一种结构化编程语言,重点在于算法和数据结构, C 程序设计首要考虑的是如何通过一个过程(包含函数和参数等)对输入进行运算处理得到输出;而 C++ 是面向对象的编程语言, C++ 程序设计首要考虑的是如何构造一个对象模型,包括数据封装、类、消息、对象接口和继承等,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程控制,所以两者的区别在于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“设计这个概念已经被融入C++之中”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值