﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-阿呆的砌码生涯-随笔分类-C++</title><link>http://www.cppblog.com/seuauto/category/7224.html</link><description>if ~~else~~</description><language>zh-cn</language><lastBuildDate>Sat, 06 Sep 2008 18:57:02 GMT</lastBuildDate><pubDate>Sat, 06 Sep 2008 18:57:02 GMT</pubDate><ttl>60</ttl><item><title>const用法小议</title><link>http://www.cppblog.com/seuauto/archive/2008/09/04/60941.html</link><dc:creator>阿呆@Rachel</dc:creator><author>阿呆@Rachel</author><pubDate>Thu, 04 Sep 2008 11:02:00 GMT</pubDate><guid>http://www.cppblog.com/seuauto/archive/2008/09/04/60941.html</guid><wfw:comment>http://www.cppblog.com/seuauto/comments/60941.html</wfw:comment><comments>http://www.cppblog.com/seuauto/archive/2008/09/04/60941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/seuauto/comments/commentRss/60941.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/seuauto/services/trackbacks/60941.html</trackback:ping><description><![CDATA[<p>const是C++的关键字之一，与其他的关键字相比，C++初学者可能对于const的使用会一时摸不着头脑，若能正确的使用const，将使你的程序更加Robust！</p>
<p><br>测试题先行～～<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ip&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">i;<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ip&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">i;<br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;ip&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">i;<br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;ip&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">i;</span></div>
<p>对于上面四个条语句，你能说出它们之间的区别吗？<br>2)和3)中const修饰的是*ip, 这表明ip所指向的变量i是const的，类似*ip = 1的操作编译的时候都会报错；4)const修饰的是ip，说明指针本身是const，修改指针指向的变量是合法的，而类似++ip修改指针本身的操作是违法的；5)指针本身和指向的变量都是const的。</p>
<p>const的用法主要体现在函数声明中的应用，它既可以修饰函数参数，还可以修饰函数的返回值，此外对于类的成员函数，它还可以修饰整个函数。下面是一个简单简单的二维向量类：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Vector2D{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;y;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Vector2D(&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;_x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;_y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;:&nbsp;x(&nbsp;_x&nbsp;),&nbsp;y(&nbsp;_y&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{}<br>&nbsp;&nbsp;&nbsp;&nbsp;Vector2D(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Vector2D&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">vec&nbsp;)&nbsp;:&nbsp;x(&nbsp;vec.x&nbsp;),&nbsp;y(&nbsp;vec.y&nbsp;)&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;修饰参数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;GetX()&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;x;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;修饰整个函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Vector2D&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Vector2D&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rval&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;修饰参数，返回值和整个函数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;Vector2D(&nbsp;x&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;rval.x,&nbsp;y&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;rval.y&nbsp;);&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br>};<br></span></div>
<p><span style="COLOR: red">--const修饰函数参数</span><br>在copy构造函数中，const修饰的是函数的参数，调用函数的时候，用相应的变量初始化const常量，则在函数体中，按照const所修饰的部分进行常量化，如形参为const Vector2D &amp;vec，则不能对传递进来的引用对象的进行改变，从而保护了原对象的属性。<br><span style="COLOR: #ff9900">[Tips]</span>const通常用于修饰指针或引用类型的参数。<br><br><span style="COLOR: red">--const修饰返回值<br></span>在重载的向量加法运算符的函数中，返回值用const修饰，这样如下的赋值操作就非法的：<br>Vector2D vec1, vec2, vec3;<br>(vec1+vec2) = vec3;<br><span style="COLOR: #ff9900">[Tips]</span>一般情况下，函数的返回值为某个对象时，如果将其声明为const时，多用于运算符的重载。通常，函数返回值为某个对象或对象的引用时，不用const来修饰。因为，这样返回的实例只能访问public成员和const成员函数，并且赋值操作也是非法的，这样的用法是非常罕见的。<br><br><span style="COLOR: red">--const修饰类的成员函数<br></span>对于Vector2D::GetX()函数，因为它不会修改成员数据，若声明成const，如果函数实现中修改了成员变量，编译的时候将报错，这样程序会更加的Robust~~<br><br><span style="COLOR: #ff9900">[Tips]</span><br>a.在你搞清楚const的用法之后，请大胆使用；<br>b.在参数中使用const应该使用引用或指针，而不是一般的对象实例；<br>c.不要轻易的将函数的返回值类型定为const；<br>d.除了重载操作符外一般不要将返回值类型定为对某个对象的const引用。</p>
<img src ="http://www.cppblog.com/seuauto/aggbug/60941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/seuauto/" target="_blank">阿呆@Rachel</a> 2008-09-04 19:02 <a href="http://www.cppblog.com/seuauto/archive/2008/09/04/60941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>malloc/free与new/delete的区别</title><link>http://www.cppblog.com/seuauto/archive/2008/08/22/59612.html</link><dc:creator>阿呆@Rachel</dc:creator><author>阿呆@Rachel</author><pubDate>Fri, 22 Aug 2008 01:06:00 GMT</pubDate><guid>http://www.cppblog.com/seuauto/archive/2008/08/22/59612.html</guid><wfw:comment>http://www.cppblog.com/seuauto/comments/59612.html</wfw:comment><comments>http://www.cppblog.com/seuauto/archive/2008/08/22/59612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/seuauto/comments/commentRss/59612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/seuauto/services/trackbacks/59612.html</trackback:ping><description><![CDATA[<p>由于编程的习惯，动态管理内存的时候总是用new/delete，malloc/free很少使用，两者之间的区别就不是很清楚了。<br><br>1. 本质区别<br>malloc/free是C/C++语言的标准库函数，new/delete是C++的运算符。<br>对于用户自定义的对象而言，用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数，对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符，不在编译器控制权限之内，不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new，以及一个能完成清理与释放内存工作的运算符delete。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Obj<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Obj(</span><span style="COLOR: #000000">) {&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;&#8220;Initialization&#8221;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Obj(</span><span style="COLOR: #000000">) {&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;&#8220;Destroy&#8221;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Initialize(</span><span style="COLOR: #000000">) {&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;&#8220;Initialization&#8221;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Destroy(</span><span style="COLOR: #000000">) {&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;&#8220;Destroy&#8221;&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;}<br>};<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;UseMallocFree(</span><span style="COLOR: #000000">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Obj&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(obj&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) malloc( </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">( obj ) );&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;allocate memory</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Initialize();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;initialization<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#8230;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Destroy();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;deconstruction</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000>// release memory<br></font></span><span style="COLOR: #000000">}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;UseNewDelete(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Obj&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Obj;&nbsp;&nbsp;</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#8230;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;a;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}</span></div>
<p><br>类Obj的函数Initialize实现了构造函数的功能，函数Destroy实现了析构函数的功能。函数UseMallocFree中，由于malloc/free不能执行构造函数与析构函数，必须调用成员函数Initialize和Destroy来完成&#8220;构造&#8221;与&#8220;析构&#8221;。所以我们不要用malloc/free来完成动态对象的内存管理，应该用new/delete。由于内部数据类型的&#8220;对象&#8221;没有构造与析构的过程，对它们而言malloc/free和new/delete是等价的。<br><br>2. 联系<br>既然new/delete的功能完全覆盖了malloc/free，为什么C++还保留malloc/free呢？因为C++程序经常要调用C函数，而C程序只能用malloc/free管理动态内存。如果用free释放&#8220;new创建的动态对象&#8221;，那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放&#8220;malloc申请的动态内存&#8221;，理论上讲程序不会出错，但是该程序的可读性很差。所以new/delete，malloc/free必须配对使用。<br></p>
<img src ="http://www.cppblog.com/seuauto/aggbug/59612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/seuauto/" target="_blank">阿呆@Rachel</a> 2008-08-22 09:06 <a href="http://www.cppblog.com/seuauto/archive/2008/08/22/59612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>