C++ 中的严格类型检查
严格的类型检查意味着必须知道每个被调用函数的函数原型(函数签名),并且被调用的函数必须与函数原型匹配。它在编译时完成。 “严格类型语言”是指一种非常强类型的语言,其中对如何对不同类型的变量执行操作有更严格的限制。
基本条款:
- 对于每个操作:其参数的数量、顺序和数据类型。
- 对于每个变量:每个对象的名称和数据类型。
- 对于每个常量:名称、数据类型和值。
一般来说,强类型语言在编译时有更严格的类型规则,这意味着在编译过程中更容易发生错误和异常,这增加了交付程序的可靠性,“如果类型不匹配,编译器会产生错误”。
函数原型指定函数名称和传递的参数数量以及函数的返回类型(如果有)。
例如:
void max ( int , int );
int max ( int , int );
void max();
1. 如果使用不正确的数据类型调用函数,编译器会警告用户。它可以帮助用户识别函数调用中的错误并提高程序的可靠性。
2. 检查执行路径:与严格类型检查一样,检查所有可能的执行路径,不需要进一步测试类型错误。因此在运行时不需要数据对象上的类型标签,也不需要动态检查。
C++
#include
using namespace std;
void add(int a, double b)
{
// printing a and b
cout << "sum = " << (a + b);
}
void add(double a, int b)
{
// printing a and b
cout << endl << "sum = " << (a + b);
}
int main()
{
// calling function on line 3
add(10, 2.5);
// calling function on line 7
add(5.5, 6);
return 0;
}
C++
#include
using namespace std;
void add(int a, double b)
{
// printing a and b.
cout << "sum=" << (a + b);
}
void add(double a, int b)
{
// printing a and b.
cout << endl << "sum=" << (a + b);
}
int main()
{
// calling add function on line 4.
add(10, 2.5);
// calling add function with 3
// parameters that will give
// error.
add(5.5, 6, 7);
return 0;
}
输出:
sum = 12.5
sum = 11.5
基于此,C++ 是一种强类型语言,它使用严格的类型检查。关于编译器,调用哪个函数没有混淆,因为它在编译时匹配参数的类型。
在 C++ 中,函数原型是强制性的。如果函数声明没有放在函数调用之前,它将引发错误,而在 C 编程语言中它是可选的。 C++ 在编译期间根据其原型声明检查传递给函数的所有参数。如果它的参数类型不匹配,它会产生错误,这可以通过放置函数的原型来克服。
C++
#include
using namespace std;
void add(int a, double b)
{
// printing a and b.
cout << "sum=" << (a + b);
}
void add(double a, int b)
{
// printing a and b.
cout << endl << "sum=" << (a + b);
}
int main()
{
// calling add function on line 4.
add(10, 2.5);
// calling add function with 3
// parameters that will give
// error.
add(5.5, 6, 7);
return 0;
}
错误:
prog.cpp: In function ‘int main()’:
prog.cpp:24:18: error: no matching function for call to ‘add(double, int, int)’
add(5.5, 6, 7);
^
prog.cpp:4:6: note: candidate: void add(int, double)
void add(int a, double b)
^
prog.cpp:4:6: note: candidate expects 2 arguments, 3 provided
prog.cpp:10:6: note: candidate: void add(double, int)
void add(double a, int b)
^
prog.cpp:10:6: note: candidate expects 2 arguments, 3 provided
这会产生错误,因为函数参数与函数add 中的参数数量不匹配。严格类型检查的好处是它允许在开发周期的早期发现许多类型错误。严格类型通常会导致编译后的代码执行得更快,因为当编译器知道正在使用的确切数据类型时,它可以生成优化的机器代码。