C++中模棱两可的错误
来源:互联网 发布:java bigdecimal用法 编辑:程序博客网 时间:2024/05/16 14:18
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){};
模棱两可的问题还有很多,不仅仅在函数重载上,其实有点后悔当时没有空去选编译原理这门课,以后要是遇到类似的问题再过来分享吧。
- C++中模棱两可的错误
- 技术小品文(二)模棱两可的陷阱
- 多继承下的“模棱两可”问题
- 《SQL反模式之“模棱两可的分组”》
- Solmyr 的小品文系列之二:模棱两可的陷阱
- Solmyr 的小品文系列之二:模棱两可的陷阱
- Solmyr 的小品文系列之二:模棱两可的陷阱
- 笔试的一些基础贮备,不怕不懂,就怕模棱两可
- SpringMVC之Ambiguous mapping(模棱两可的映射)
- C中相关的错误处理
- 标准c中不可能发生的错误
- C语言中不易察觉的错误
- C中遇到的段错误
- C语言编程中常见的错误
- C 中常见的编程错误
- C/C++编程中遇到的错误
- c/c++中常见的错误
- c/c++中错误的处理
- spring+mybatis+Atomikos JTA事务配置说明
- 10个很有用但是IE浏览器不支持的CSS属性
- httpclient 使用代理
- 利用内核自带的spi测试测试spi驱动的时候,mosi没有之恋miso,miso怎么也能收到数据?
- Maven 手动添加 JAR 包到本地仓库
- C++中模棱两可的错误
- 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
- Android系统权限配置
- 在页面通过java读取文件中的值
- SSH开发中中文乱码问题
- Protocol Buffer技术规范
- 最优二叉检索树
- mysql相关笔记
- HTTP协议