用转换操作符保护代码的安全

摘要:不经意的对象转换常常严重地危害代码的安全。幸运的是,转换操作符允许你根据 实际情况来启用和禁用转换,这有助于避免出现病态行为。

某些对象必须要被转换成 低级形式,反之亦然。例如,使用 std::string 对象的程序员必须将之转换为 char 指针, 请看下面例子:

string inf="mydata.txt";
ifstream infile (inf.c_str());// 必须要转成 const char*

同样,PSOIX 程序员需要将 <fstream> 对象转换成文件描述符以便 使用本地系统调用。

如何在不危及代 码安全性的前提下让对象自动转换到其底层类型呢?

使用转换操作符和 explicit 构 造函数来创建具备双接口的对象,从而避免病态行为转换。

提出问题:

商业 和金融应用常常将币值表示成对象,而不是原始的浮点类型。之所以要这样做有几个原因:

类型安全:人为错误更容易被发现;

可移植性:由于对用户隐藏实现细 节,代码具有更好的可移植性;

业务逻辑:类允许你强化了业务逻辑规则。例如 :美元(US dollar)类知道一美元是 100 美分(cents),而科威特第纳尔(dinar)类知 道一第纳尔是 1000 菲尔斯(fils)。这种差别将影响 I/O 格式。

下面是一个简 化了的表示美国货币的类:

class USD
{
private:
  __int64 dollars; //或者 long long, 依赖编译器
  int cents;
public:
   USD(__int64 d=0, int c=0) :
   dollars(d), cents(c) {}
   friend bool operator==(const USD& d1, const USD& d2);
   //...other overloaded operators and functions
};  

唉,许多数学函数如:pow() 和 sqrt()都只认浮点变量。为了克服这个问题人们总是去重载关系操作符和算子。然而,你 会发现这将带来大量无谓的编码,测试和维护工作。你想要的只不过是一个双接口:在适当 的上下文中,USD 类对象除了应该提供安全的自动的到基本类型的转换外,它还应该提供上 述所列的优点。

时间: 2024-11-03 01:13:53

用转换操作符保护代码的安全的相关文章

C#中如何利用操作符重载和转换操作符

原文:C#中如何利用操作符重载和转换操作符 操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整数加到一起的代码. 当编译器发现两个string类型的实例使用+操作符的时候,编译器会生成把两个字符串连接到一起的代码.那么编译器怎么就会知道这样做呢?如何进行操作符重载呢? 下面C#代码展示了一个类中如何进行操作符重载: namespace Do

强名称(1)使用强名称保护代码完整性

强名称是由程序集的标识加上公钥和数字签名组成的.其中,程序集的标识包括简单文本名称.版本号和区域性信息(如果提供的话).强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的.Microsoft Visual Studio .NET 和在 .NET Framework SDK 中提供的其他开发工具能够将强名称分配给一个程序集.强名称相同的程序集应该是相同的. 通过签发具有强名称的程序集可以确保名称的全局唯一性.强名称满足以下要求: 1

ASP.NET JSON字符串与实体类的互转换的示例代码

 本篇文章主要是对ASP.NET JSON字符串与实体类的互转换的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 还是先封装一个类吧! 这个类网上都可以找到的!有个这个类,一切都将变得简单了,哈哈. 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Runtime.Serialization.Json; using Sys

Java 时间转换的实例代码_java

Java 时间转换的实例代码 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created by Edward on 2016/6/30. */ public class TimeUtil { /** * 将 1467341232351 转换为 指定格式 "yyyy-MM-dd HH:mm:ss.

编程-有没有人帮我转换一下这代码???

问题描述 有没有人帮我转换一下这代码??? 好像听说goto gett;相当于while语句,能不能帮我转换一下下面的代码,看得不是很懂.. 解决方案 是跳转的意思,把gett;标签下面的代码收拢成一个函数 gotoMethod(),然后在goto的地方写上 gotoMethod(): break: 即可 解决方案二: goto gett;在你的代码中相当于break不相当于while 解决方案三: 漏了这张没上传,补上...... 解决方案四: goto和while没有必然关系吧,goto语句

php ubb转换成html,html转换成ubb代码

php ubb转换成html,html转换成ubb代码 function htmlToUBB($str) {  $str = preg_replace("/<img[^>]+src="([^"]+)"[^>]*>/i","[img]$1[/img]",$str);  $str = preg_replace("/<embed[^>]+src="([^"]+)"[^

html转换成UBB代码

html转换成UBB代码 Function Html2Ubb(str)  If Str<>"" And Not IsNull(Str) Then   Dim re,tmpstr   Set re=new RegExp   re.IgnoreCase =True   re.Global=True   re.Pattern = "(<STRONG>)":Str = re.Replace(Str,"<b>")   r

Angular.js 实现数字转换汉字实例代码_AngularJS

AngularJS 简介 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML. 下面通过本文给大家介绍Angular.js 实现数字转换汉字实例代码,具体代码如下所示: // 1.实现输入数字输出对应汉字,要求使用angularjs,不准使用$watch函数,for循环:提示:ng-change指令 <div ng-app="my

汉字转换拼音js代码

汉字转换拼音js代码 dd="a,20319,ai,20317,an,20304,ang,20295,ao,20292,ba,20283,bai,20265,ban,20257,bang,20242,bao,20230,bei,20051,ben,20036,beng,20032,bi,20026,bian,20002,biao,19990,bie,19986,bin,19982,bing,19976,bo,19805,bu,19784,ca,19775,cai,19774,can,19763,