动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.C++运算符重载函数基础及其值返回.
.递归找迷宫.
.Windows的动态链接库原理及使用2.
.C语言中的位运算.
.深度探索C++对象模型(5).
.关于 MD5 的一些知识.
.写好C程序的10条秘籍.
.socket编程原理.
.UDP编程.
.C++的iostream标准库介绍(1).
.51单片机Keil C延时程序的简单研.
.C++箴言:理解 new-handler的行为.
.C++ Builder创建组件探密.
.用BCB5的打包程序打包BCB6.
.有趣的分形学Mandlbrot集图形的一.
.C语言入门之分支结构(2).
.经典c程序100例==31--40.
.很普通很普通的猜数字游戏.
.嵌入式程序员应知道的几个基本问.
.C/C++程序员应聘常见面试题深入剖.

More Effective C++:不要重载的操作符

发表日期:2008-3-8 |



  与C一样,C++使用布尔表达式简化求值法(short-circuit evaluation)。这表示一旦确定了布尔表达式的真假值,即使还有部分表达式没有被测试,布尔表达式也停止运算。例如:

char *p;
...

if ((p != 0) && (strlen(p) > 10)) ...
  这里不用担心当p为空时strlen无法正确运行,因为假如p不等于0的测试失败,strlen不会被调用。同样:

int rangeCheck(int index)
{
 if ((index < lowerBound) (index > upperBound)) ...
  ...
}
  假如index小于lowerBound,它不会与upperBound进行比较。
 
  很早以前上述行为特性就被反复灌输给C和C++的程序员,所以他们都知道该特性。而且他们也依靠于简短求值法来写程序。例如在上述第一个代码中,当p为空指针时确保strlen不会被调用是很重要的,因为C++标准说(正如C标准所说)用空指针调用strlen,结果不确定。

  C++答应根据用户定义的类型,来定制&&和操作符。方法是重载函数operator&& 和operator,你能在全局重载或每个类里重载。然而假如你想使用这种方法,你必须知道你正在极大地改变游戏规则。因为你以函数调用法替代了简短计算法。也就是说假如你重载了操作符&&,对于你来说代码是这样的:

if (eXPression1 && expression2) ...
  对于编译器来说,等同于下面代码之一:

if (expression1.operator&&(expression2)) ...
// when operator&& is a
// member function
if (operator&&(expression1, expression2)) ...
// when operator&& is a
// global function
  这似乎没有什么不同,但是函数调用法与简短求值法是绝对不同的。首先当函数被调用时,需要运算其所有参数,所以调用函数functions operator&& 和 operator时,两个参数都需要计算,换言之,没有采用简短计算法。第二是C++语言规范没有定义函数参数的计算顺序,所以没有办法知道表达式1与表达式2哪一个先计算。完全与具有从左参数到右参数计算顺序的简短计算法相反。

  因此假如你重载&&或,就没有办法提供给程序员他们所期望和使用的行为特性,所以不要重载&&和。

  同样的理由也适用于括号操作符,但是在我们深入研究它之前,我还是暂停一下,让你不要太惊奇,“逗号操作符?哪有逗号操作符?”确实存在。

  逗号操作符用于组成表达式,你经常在for循环的更新部分(update part)里遇见它。例如下面来源于Kernighan's and Ritchie's 经典书籍The C Programming Language 第二版(Prentice-Hall, 1988)的函数:

// reverse string s in place

void reverse(char s[])
{
 for (int i = 0, j = strlen(s)-1;i < j;++i, --j) // 啊! 逗号操作符!
 {
  int c = s[i];
  s[i] = s[j];
  s[j] = c;
 }
}
  在for循环的最后一个部分里,i被增加同时j被减少。在这里使用逗号很方便,因为在最后一个部分里只能使用一个表达式,分开表达式来改变i和j的值是不合法的。

  对于内建类型&&和,C++有一些规则来定义它们如何运算。与此相同,也有规则来定义逗号操作符的计算方法。一个包含逗号的表达式首先计算逗号左边的表达式,然后计算逗号右边的表达式;整个表达式的结果是逗号右边表达式的值。所以在上述循环的最后部分里,编译器首先计算++i,然后是—j,逗号表达式的结果是--j。

  也许你想为什么你需要知道这些内容呢?因为你需要模拟这个行为特性,假如你想大胆地写自己的逗号操作符函数。不幸的是你无法模拟。

  假如你写一个非成员函数operator,你不能保证左边的表达式先于右边的表达式计算,因为函数(operator)调用时两个表达式做为参数被传递出去。但是你不能控制函数参数的计算顺序。所以非成员函数的方法绝对不行。

  剩下的只有写成员函数operator的可能性了。即使这里你也不能依靠于逗号左边表达式先被计算的行为特性,因为编译器不一定必须按此方法去计算。因此你不能重载逗号操作符,保证它的行为特性与其被料想的一样。重载它是完全轻率的行为。

  你可能正在想这个重载恶梦究竟有没有完。究竟假如你能重载逗号操作符,你还有什么不能重载的呢?正如显示的,存在一些限制,你不能重载下面的操作符:

. .* :: ?:

new delete sizeof typeid

static_cast dynamic_cast const_cast reinterpret_cast
  你能重载:

operator new operator delete

operator new[] operator delete[]

+ - * / % ^ & ~

! = < > += -= *= /= %=

^= &= = << >> >>= <<= == !=

<= >= && ++ -- , ->* ->

() []
  当然能重载这些操作符不是去重载的理由。操作符重载的目的是使程序更轻易阅读,书写和理解,而不是用你的知识去迷惑其他人。假如你没有一个好理由重载操作符,就不要重载。在碰到&&, , 和 ,时,找到一个好理由是困难的,因为无论你怎么努力,也不能让它们的行为特性与所期望的一样。

上一篇:C++箴言:只要有可能就推迟变量定义 人气:327
下一篇:开机密码 人气:361
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号