C++究竟是不是强类型语言?
- 结论始终有争议,没有一致意见
- 目前普遍认为:C++是一种对变量类型进行静态检查的强类型编程语言
- 什么是强/弱类型(Strong/Weak typing)编程语言?
- 强类型语言表现为 限制大多数变量类型的隐式转换,而弱类型语言表现为 允许大多数变量类型的隐式转换
- 经典例子:
a = "10" + 5;
,强类型语言将无法执行这一语句(提示类型错误),弱类型语言可能会将字符串"10"
隐式转换为数字10
或者将数字5
隐式转换为字符串"5"
。
- 经典例子:
- 注意“强”和“弱”是相对而言的:例如人们经常将C++、Java等语言称为强类型语言,而Javascript等语言称为弱类型语言。
- 强类型语言并不是完全禁止隐式类型转换,只是隐式类型转换的情形较少;
- 强类型语言表现为 限制大多数变量类型的隐式转换,而弱类型语言表现为 允许大多数变量类型的隐式转换
- 什么是静态类型检查/动态类型检查语言?
- 动态类型检查语言的特征:一般不需要在定义变量时显式指定变量类型。其中一些语言中给同一个变量赋不同类型的值/给同一个形参赋不同类型值(注意不是转换,是覆盖)是被允许的,变量的类型会被更改。
- 例如:
a = 10; a = "5";
- 例如:
- 静态类型检查语言的特征:一般需要在定义变量时指定其类型;相当于定义变量时就为变量分配了符合其类型的内存空间;
- 例如:
int a = 10;
- 例如:
- 动态类型检查语言的特征:一般不需要在定义变量时显式指定变量类型。其中一些语言中给同一个变量赋不同类型的值/给同一个形参赋不同类型值(注意不是转换,是覆盖)是被允许的,变量的类型会被更改。
NULL带来的问题
- NULL的本质是0,也就是说下面两个语句其实是等价的:
1 | int* a = NULL; |
- C语言还好,但是C++语言中就会出现问题:因为C++引入了“函数重载”这一概念。思考下面两个函数:
1 | void func(int num) |
- 此时调用
func(NULL)
究竟会输出A还是输出B呢?因为具有了二义性,所以无法确定答案。此时就需要使用nullptr
解决二义性。nullptr
的类型为nullptr_t
,无法被转换为数字(int)。 - 调用
func(nullptr)
,程序会正常编译,并输出“B”。调用func(NULL)
就可以和调用func(0)
一样输出“A”了。