【C++】弱类型的C++

(点击上方公众号,可快速关注)

C++是强类型语言吗?

在很多人眼里至少它不算弱类型语言,因为它在C语言的基础上类型增强了很多,如,nullptr_t类型区分整型的NULLenum class 增强了作用域等。但由于兼容C语言,所以语言的某些部分永远“强”不起来,所以,一定要记住:C++是弱类型语言

强类型语言在编译时能给予程序更多的安全保证,所以经常有人说,程序编译通过了基本就没bug了,C++则不然。最近遇到一个比较典型的例子,简化如下。

一开始appidint类型,使用process(1, 0)调用。

void process(int arg, int appid) {
     //处理
}

int main(int argc, char *argv[]) {
   process(1, 0);

   return 0;
}

后面迭代,appid改为了字符串类型,还是使用process(1, 0)调用,如下:

#include 

void process(int arg, const std::string& appid) {
    //处理
}

int main(int argc, char *argv[]) {
   process(1, 0);

   return 0;
}

我只修改process声明和定义部分,调用部分没有修改。0是整型,肯定不是字符串啊,我是期望编译器编译过程会报错,能把所有类型不符的地方列出来,再统一修改。然而,编译器正常编译通过,竟然没有报错,程序却在执行过程中崩溃。

其实这里就兼容了C里的一条隐藏的规则,0就是NULLNULL为空指针,当然也可以隐式转换为char*类型,std::string有个接受const char*参数的构造函数,所以,实际上调用process(1, 0)时,实际上会执行process(1, std::string((const char*)0),用空指针构造std::string,所以导致了崩溃。

你可能感兴趣的:(c++,前端,算法,javascript,开发语言)