📄 effective c++ 2e item17.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0047)http://www.csdn.net/develop/article/8/8744.shtm -->
<HTML><HEAD><TITLE>Effective C++ 2e Item17</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content=0 http-equiv=Expires><LINK
href="Effective C++ 2e Item17.files/news.css" rel=stylesheet>
<STYLE type=text/css>.fst {
BACKGROUND: #eeeecc; BORDER-LEFT: #000000 1px solid; BORDER-RIGHT: #000000 1px solid; PADDING-BOTTOM: 0px; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; PADDING-TOP: 0px; WIDTH: 770px
}
.fstdiv3 IMG {
BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-RIGHT: #eeeecc 8px solid; BORDER-TOP: #eeeecc 6px solid
}
</STYLE>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR></HEAD>
<BODY aLink=#990000 bgColor=#ffffff bottomMargin=0 leftMargin=0 rightMargin=0
topMargin=0 marginheight="0" marginwidth="0">
<SCRIPT language=javascript1.2>
<!--
var currentpos,timer;
function initialize()
{
timer=setInterval('scrollwindow()',10);
}
function sc(){
clearInterval(timer);
}
function scrollwindow()
{
currentpos=document.body.scrollTop;
window.scroll(0,++currentpos);
if (currentpos != document.body.scrollTop)
sc();
}
document.onmousedown=sc
document.ondblclick=initialize
//-->
</SCRIPT>
<CENTER><LINK href="news.css" rel=stylesheet>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR vAlign=bottom>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/1.gif"
width=14></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/">CSDN主页</A></FONT></DIV></TD>
<TD bgColor=#001880 height=22 width=185>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/2.gif"
width=70></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/y1.gif"
width=3></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/news/">新闻聚焦</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=center><FONT color=#ff6633><A
href="http://www.csdn.net/cnshare/">共享软件</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=14></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/buy/">俱乐部</A><IMG
src="http://www.csdn.net/images/buy.gif"></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><A href="http://www.csdn.net/develop/"><FONT
color=red>开发文档</FONT></A></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://expert.csdn.net/">专家门诊</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/job/">招聘求职</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><FONT color=#ff6633><A
href="http://www.csdn.net/linux/">Linux园地</A></FONT></DIV></TD>
<TD height=22>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/jiao.gif"
width=15></DIV></TD>
<TD background="Effective C++ 2e Item17.files/di.gif" height=22>
<DIV align=left><A href="http://www.csdn.net/magazine/">程序员杂志</A></DIV></TD>
<TD height=22 width=11>
<DIV align=left><IMG height=22 src="http://www.csdn.net/images/j1.gif"
width=11></DIV></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR>
<TD bgColor=#001880 height=5 width=2></TD>
<TD height=5 width=768></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR>
<TD bgColor=#001880 width=2></TD>
<TD width=158><IMG border=0
src="http://www.csdn.net/images/csdn_logo.gif"></TD>
<TD align=middle width=470>
<OBJECT classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000
codeBase=http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0
height=60 id=Movie1 width=468><PARAM NAME="movie" VALUE="http://www.csdn.net/images/ad/magazine6_1.swf"><PARAM NAME="quality" VALUE="high">
<EMBED src='http://www.csdn.net/images/ad/magazine6_1.swf' quality=high
WIDTH=468 HEIGHT=60 TYPE='application/x-shockwave-flash'
PLUGINSPAGE='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'>
</EMBED></OBJECT><IMG border=0 height=0
src="http://www.csdn.net/count/pageview.asp?name=cnshare" width=0> </TD>
<TD align=right width=140>
<SCRIPT>document.write("<img src=http://www.csdn.net/count/pageview.asp?name=develop border=0 width=0 height=0>");</SCRIPT>
<A href="http://www.csdn.net/dev/"><IMG border=0 height=60
src="http://www.csdn.net/develop/images/kfzxt3.gif" width=120></A>
</TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=770>
<TBODY>
<TR>
<TD bgColor=#001880 width=2></TD>
<FORM action=http://www.csdn.net/member/logon.asp method=post target=_blank>
<TD bgColor=#e0dedf vAlign=bottom width=340> 昵称:<INPUT class=from1
name=name size=10> 密码:<INPUT class=from1 name=pass size=10
type=password> <SELECT name=type size=1> <OPTION value=1>我的论坛</OPTION>
<OPTION value=2>我的软件</OPTION> <OPTION value=3>我的订单</OPTION> <OPTION
selected value=4>我的文档</OPTION> <OPTION value=5>我的简历</OPTION></SELECT></TD>
<TD bgColor=#e0dedf vAlign=bottom width=45><INPUT height=17
src="http://www.csdn.net/images/denglu.gif" type=image width=44> </TD>
<TD bgColor=#e0dedf vAlign=bottom width=45><A
href="http://www.csdn.net/expert/zc.asp" target=_parent><IMG border=0
src="http://www.csdn.net/images/zhuce.gif"></A> </TD></FORM>
<FORM action=http://www.csdn.net/find.asp method=post target=_blank>
<TD align=right bgColor=#e0dedf vAlign=bottom width=293><INPUT class=from1
name=search> <SELECT name=type size=1> <OPTION value=1>新闻</OPTION>
<OPTION value=2>软件</OPTION> <OPTION value=3>商品</OPTION> <OPTION selected
value=4>文档</OPTION> <OPTION value=5>论坛</OPTION></SELECT></TD>
<TD bgColor=#e0dedf vAlign=bottom width=45><INPUT height=17
src="http://www.csdn.net/images/sousuo.gif" type=image width=44>
</TD></FORM></TR></TBODY></TABLE>
<TABLE align=center bgColor=#cccc99 border=0 cellPadding=2 cellSpacing=0
width=770>
<TBODY>
<TR>
<TH align=left>Effective C++ 2e Item17
</TH></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#eeeecc border=1 cellPadding=1 cellSpacing=0
width=770>
<TBODY>
<TR>
<TD align=left width=300><B>关键字:</B><BR>Effective C++ </TD>
<TD align=middle width=120><B>贴文时间</B><BR>2001-7-9 20:14:22 </TD>
<TD align=middle width=80><B>文章类型: </B><BR>翻译 </TD>
<TD align=middle width=100><B>给贴子投票 </B><BR><A
href="http://www.csdn.net/develop/addscore.asp?id=8744">投票</A> </TD></TR>
<TR>
<TD> lostmouse 翻译 </TD>
<TD colSpan=3 vAlign=top><B>出处: </B><A
href="http://www.csdn.net/develop/article/8/Effective%20C++%202e%20e-book">Effective
C++ 2e e-book </A></TD></TR>
<TR>
<TD bgColor=#cccc99 colSpan=5> </TD></TR></TD></TR></TBODY></TABLE>
<DIV align=center>
<DIV align=left class=fst>
<DIV class=fstdiv3 id=print2><BR><BR>
<P> </P>
<P>条款17: 在operator=中检查给自己赋值的情况</P>
<P>做类似下面的事时,就会发生自己给自己赋值的情况:</P>
<P>class X { ... };</P>
<P>X a;</P>
<P>a =
a;
// a赋值给自己</P>
<P>这种事做起来好象很无聊,但它完全是合法的,所以看到程序员这样做不要感到丝</P>
<P>毫的怀疑。更重要的是,给自己赋值的情况还可以以下面这种看起来更隐蔽的形式</P>
<P>出现:</P>
<P>a = b;</P>
<P>如果b是a的另一个名字(例如,已被初始化为a的引用),那这也是对自己赋值,</P>
<P>虽然表面上看起来不象。这是别名的一个例子:同一个对象有两个以上的名字。在</P>
<P>本条款的最后将会看到,别名可以以大量任意形式的伪装出现,所以在写函数时一</P>
<P>定要时时考虑到它。</P>
<P>在赋值运算符中要特别注意可能出现别名的情况,其理由基于两点。其中之一是效</P>
<P>率。如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,</P>
<P>从而可以节省大量的工作,否则必须去实现整个赋值操作。例如,条款16指出,一</P>
<P>个正确的派生类的赋值运算符必须调用它的每个基类的的赋值运算符,所以在派生</P>
<P>类中省略赋值运算符函数体的操作将会避免大量对其他函数的调用。</P>
<P>另一个更重要的原因是保证正确性。一个赋值运算符必须首先释放掉一个对象的资</P>
<P>源(去掉旧值),然后根据新值分配新的资源。在自己给自己赋值的情况下,释放</P>
<P>旧的资源将是灾难性的,因为在分配新的资源时会需要旧的资源。</P>
<P>看看下面String对象的赋值,赋值运算符没有对给自己赋值的情况进行检查:</P>
<P>class String {<BR>public:<BR> String(const char
*value); //
函数定义参见条款11<BR>
// </P>
<P>
~String();
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -