description: 最近看了好多C++的书籍,头都大了,感触比较深的是很多东西还是吃不透,自己在面向对象这块的积累还不够深,读起来比较吃力。后面准备多动手,每天从一些小的细节着手,慢慢修真自己一些不良的编程习惯。
最近看了好多C++的书籍,头都大了,感触比较深的是很多东西还是吃不透,自己在面向对象这块的积累还不够深,读起来比较吃力。后面准备多动手,每天从一些小的细节着手,慢慢修真自己一些不良的编程习惯。之前因为在公司比较忙,也没什么时间对自己学过的shell编程等知识点进行总结,这段时间也可以抽空做一下。
C++中的模棱两可相信大家也经常遇到,当然很多时候往往是在调试错误的时候才发现原来陷阱是因为自己的模棱两可造成的。看下面的代码:
#include <iostream>
void func(int var)
{}
void func(float var)
{}
using namespace std;
int main(int argc, char *argv[]) {
func(2.5);
}
有一定经验的程序员肯定能猜到编译结果(call to ‘func’ is ambiguous),因为2.5在C++中默认存储的数据类型是double,而重载的函数参数是int和float,double可以转换为int和float,就会出现模棱两可的错误。如果代码修改为:
#include <iostream>
void func(int var)
{}
void func(double var)
{}
using namespace std;
int main(int argc, char *argv[]) {
float tmp = 2.5;
func(tmp);
}
这样编译器并不会报错,虽然float可以转换为int和double两种类型,float转int回损失一定的数据精度,而float转double并不会损失数据精度,所以编译器做了决定,而对于double转int和float两种类型都会损失数据精度,所以编译器无从下手。这是一个比较典型的浮点数问题,告诫了大家在设计函数的时候只要涉及到浮点数的场合都应该使用double类型,即使别人使用float来调用也不会有问题。
函数重载同样会出现模棱两可的情况,对于这种情况避免的方法有很多,一种是用模板来代替重载,尤其是对于处理算法相同,只是数据类型不同的函数,如果处理算法不同,尽量保证函数的参数不同(可以自己定义加入无用的参数)。
void func(double db, int){};
void func(int db){};
模棱两可的问题还有很多,不仅仅在函数重载上,其实有点后悔当时没有空去选编译原理这门课,以后要是遇到类似的问题再过来分享吧。