编写高质量代码——提防隐式转换带来的麻烦
来源:互联网 发布:网络推广软件破解版 编辑:程序博客网 时间:2024/05/16 16:55
在C/C++ 语言,允许在不同类型的数据之间进行某一操作或混合操作,如果类型不同,则要将数据转换成相同的数据类型(隐式转换和显示转换)。
=========================
隐式转换主要发生的情形:
▉基本类型之间的隐式转换
C/C++ 中规定的两个通用转换原则:
1)为防止精度损失,类型总是被提升为较宽的类型。
2)所有含有小于整数类型的算术表达式在计算之前其类型都被转换成整形。
对于C++最直接的害处是:可能导致 重载函数 产生二义性。
例如:
void Print(int inval);
void Print(float fval);
int ival = 2;
float fval = 2.0f;
Print(ival); // OK, int-version
Print(fval); // OK, float-version
Print(1); //OK, int-version
Print(0.5); //ERROR ! !
▉T* 指针到 void* 的隐式转换
▉non-explict constructor 接受一个参数的用户定义类对象之间隐式转换:
class A{
public:
A(int x):m_data(x){}
private:
int m_data;
};
void DoSomething(A aObject);
DoSomething(20);
------------------------------------------------------------------
调用DoSomething() 函数时,实参和形参类型不一致,但是类A的构造函数含有一个 int 类型的参数,编译器会以 20 为参数调用A的构造函数,以便构造临时对象,然后传给 DoSomething() 函数。
------------------------------------------------------------------
当无法完成类似上述的直接隐式转换时,编译器会尝试间接的方式:
void DoSomething(A aObject);
float fval = 20.0f;
DoSomething(fval);
------------------------------------------------------------------
Note:1)隐式转换一个误用也许会引起难以捉摸的错误
2)隐式转换过程中需要调用类的构造函数、析构函数,如果这种转换代价很大,那么这样的隐式转换将会影响系统性能。
------------------------------------------------------------------
相对安全的隐式转换:子类到基类的隐式转换 和const 到 non-const 的同类型隐式转换=========================
控制隐式转换的两条有效途径:
●使用具名转换函数:
用 operator as_T() 替代 operator T()(T 为 C++ 数据类型)
●使用 explict 限制的构造函数(只针对有一个单参数构造函数的用户自定义类型)
class Widget{
public:
Widget( unsigned int factor );
Widget( const char* name, const Widget* other = NULL );
};// 在只有一个参数时,unsigned int 和 const char* 参数类型的数据均可隐式转换为自定义的 Widget 类型
控制以上隐式转换的方法:为单参数的构造函数加explicit关键字
class Widget{
public:
explicit
Widget( unsigned int factor );
explicit
Widget( const char* name, const Widget* other = NULL );};
- 编写高质量代码——提防隐式转换带来的麻烦
- 编写高质量代码——提防对象的切片
- 改善C++ 程序的150个建议学习之建议17:提防隐式转换带来的麻烦
- 隐式转换带来的麻烦
- 编写高质量代码——笔记
- 编写高质量的代码——从命名入手
- 编写高质量的代码——从命名入手
- 编写高质量的代码——从命名入手
- 编写高质量的代码——从命名入手
- 编写高质量的代码——从命名入手
- 编写高质量的代码——从命名入手
- 编写高质量的代码——从命名入手
- 编写高质量的代码——从命名入手
- 二、编写高质量的代码—数据类型(笔记)
- 编写高质量的代码
- 编写高质量的代码
- 编写高质量的代码——从命名入手编写高质量的代码——从命名入手
- 代码质量优先——《编写高质量代码:改善c程序代码的125个建议》
- 浅谈性能指标的定义
- java中文和英文在线帮助
- BoxFilter包滤波器
- Android数据存储方式
- js页面跳转的问题(跳转到父页面、最外层页面、本页面)
- 编写高质量代码——提防隐式转换带来的麻烦
- windows下编程控制摄像头(二)
- eclipse 使用技巧、经验 (编码、格式化模板、字体)
- assert
- mac下使用jsoncpp解析json
- SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
- Shell编程基础
- js 有框架页面跳转(target)
- linux僵尸进程