nullptr

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
2
int* a = NULL;
int* b = 0;
  • C语言还好,但是C++语言中就会出现问题:因为C++引入了“函数重载”这一概念。思考下面两个函数:
1
2
3
4
5
6
7
8
9
void func(int num)
{
std::cout << "A" << std::endl;
}

void func(std::string* str)
{
std::cout << "B" << std::endl;
}
  • 此时调用func(NULL)究竟会输出A还是输出B呢?因为具有了二义性,所以无法确定答案。此时就需要使用nullptr解决二义性。nullptr的类型为nullptr_t,无法被转换为数字(int)。
  • 调用func(nullptr),程序会正常编译,并输出“B”。调用func(NULL)就可以和调用func(0)一样输出“A”了。
评论