﻿<?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++博客-杰 &amp; C++ &amp; Python &amp; DM</title><link>http://www.cppblog.com/jaysoon/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 20 Apr 2026 21:57:13 GMT</lastBuildDate><pubDate>Mon, 20 Apr 2026 21:57:13 GMT</pubDate><ttl>60</ttl><item><title>命令行下Java的编译及运行（2）</title><link>http://www.cppblog.com/jaysoon/archive/2012/09/06/188927.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Thu, 06 Sep 2012 10:56:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2012/09/06/188927.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/188927.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2012/09/06/188927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/188927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/188927.html</trackback:ping><description><![CDATA[<a></a><br />　　<a title="上篇博文" href="http://www.cppblog.com/jaysoon/archive/2012/08/22/187508.html">上篇博文</a>中说明了如何通过命令编译及运行自己的Java文件。但是当前都是以项目为单位的，如何组织项目中的文件以及对项目的编译运行，是命令行编译主要解决的问题。<br /><br />　　<strong><span style="font-size: 14pt;">1. 项目组织</span></strong><br />　　我们以下面的项目作为样例来说明：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">Test</span><span style="color: #000000; ">/</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;Test.jar<br /></span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;classes<br /></span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;Main.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;OutterTest.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;`</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;inner<br /></span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;InnerTest.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;run.py<br /></span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;run.sh<br />`</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;src<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;Main.java<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">|--</span><span style="color: #000000; ">&nbsp;OutterTest.java<br />&nbsp;&nbsp;&nbsp;&nbsp;`</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;inner<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;InnerTest.java</span></div><br />　　上面是一个项目：Test。其中，有两个文件夹，src用来放置所有的源代码，也就是.java文件；classes用来放置相应的.class文件。Test.jar是最终生成的jar文件，run.py和run.sh是项目的脚本文件。下面列出三个.java文件，只是简单的显示一句话：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Main.java</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;inner.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Main<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">main:&nbsp;hello&nbsp;word!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutterTest&nbsp;out1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;OutterTest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out1.hello();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InnerTest&nbsp;in1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;InnerTest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in1.hello();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;OutterTest.java</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;OutterTest<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hello()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;OutterTest!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;InnerTest.java</span><span style="color: #008000;"><br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;inner;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;InnerTest<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hello()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;InnerTest!</span><span style="color: #000000; ">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br />　　注意上面的InnerTest类，它在package inner中，所以将InnerTest.java放在inner文件夹下，这样可以保证统一。在Eclipse中，新建一个类时，会让你填写package名，然后Eclipse会为你新新建一个相应的文件夹。<br /><br />　　<strong><span style="font-size: 14pt;">2. 项目编译</span></strong><br />　　<br />　　<strong>javac -d classes src/*.java src/inner/*.java</strong><br />　　<br />　　由上一篇知道，javac中-d表示&#8221;指定存放生成的类文件的位置&#8220;，也就是将生成的.class文件放在-d指定的文件夹中。需要指出的是，classes文件夹是手动建立的。<br />　　另外，javac还可以批量编译.java文件，上面的命令表示编译src目录下的所以.java文件、编译src/inner目录下的所有.java文件。这样就可以批量编译.java文件，并将生成的.class文件放在classes文件夹中。这里同样要指出一点，因为package inner的关系，会自动建立inner文件夹，并将所有package inner下的类文件.class放在classes/inner下。<br /><br />　　<strong><span style="font-size: 14pt;">3.项目打包</span></strong><br />　　<br />　　<strong>jar -cvf Test.jar -C classes/ .</strong><br /><br />　　这个命令将会把classes下的所有文件（包括.class和文件夹等）打包为Test.jar文件。<br />　　上篇博客中，介绍了参数-C的意义：-C&nbsp; 更改为指定的目录并包含其中的文件，如果有任何目录文件, 则对其进行递归处理。它相当于使用&nbsp;cd&nbsp;命令转指定目录下。<br />　　注意后面的"."的用法，jar可以递归的打包文件夹，"."表示是当前文件夹。如果执行命令&#8220;jar -cvf Test.jar .&#8221;，表示将当前目录下的所有文件及文件夹打包。所以上面的命令的意思就是&#8220;将classes下的所有文件打包为Test.jar&#8221;。<br /><br />　　<strong><span style="font-size: 14pt;">4.项目运行</span></strong><br />　　<br />　　<strong>java -cp Test.jar Main</strong><br /><br />　　通过上面的命令就可以执行Test.jar中的Main.class。其中，cp指定了jar文件的位置。<br /><br />　　<strong><span style="font-size: 14pt;">5. 脚本文件</span></strong><br />　　通过上面的几步，我们就可以完成整个项目的编译和运行。而且，通过src和classes两个文件夹将源文件和目标文件分开，使项目比较整洁。但是如果每次编译、运行都要输入上面一系列命令，还是比较繁琐的，尤其当项目文件较多时，这时通过脚本文件管理整个项目是明智的选择。<br />　　下面是项目的脚本文件run.py<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;os<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;sys<br /><br /></span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__name__</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProjectJar&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Test.jar</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;sys.argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">c</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Compile&nbsp;program.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">src/*.java&nbsp;src/inner/*.java</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">javac&nbsp;-d&nbsp;classes&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;src)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">jar&nbsp;-cvf&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;ProjectJar&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">&nbsp;-C&nbsp;classes/&nbsp;.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;sys.argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">r</span><span style="color: #800000; ">"</span><span style="color: #000000;">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Run&nbsp;program.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">java&nbsp;-cp&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;ProjectJar&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">&nbsp;Main</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Over!</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br /></span></div><br />　　通过这个脚本文件，可以使用"python run.py c"完成项目的编译、打包；使用"python run.py r"运行项目。<br /><br />　　通过这篇文章，我们已经了解了Java项目的管理方法，以及编译、打包、运行的命令行，最后介绍了使用脚本文件有效管理项目。<br />　　附件中包含整个项目，同时还包括一个run.sh，方便不熟悉python的人查看。<br />　　附件：　<a title="Test.tar" href="http://www.cppblog.com/Files/jaysoon/Test.tar">Test.tar</a><img src ="http://www.cppblog.com/jaysoon/aggbug/188927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2012-09-06 18:56 <a href="http://www.cppblog.com/jaysoon/archive/2012/09/06/188927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>命令行下Java的编译及运行（1）</title><link>http://www.cppblog.com/jaysoon/archive/2012/08/22/187508.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Wed, 22 Aug 2012 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2012/08/22/187508.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/187508.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2012/08/22/187508.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/187508.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/187508.html</trackback:ping><description><![CDATA[<br />　　当前大部分开发者在开发Java程序时使用Eclipse，它可以方便的进行程序的编译、打包和运行。但是不使用IDE，在完全的命令行下进行Java开发者从未用过的。在命令行下进行开发不是用来在展现自己有多牛，而是通过命令行开发，可以对Java的编译、jar包等各个部分有一个深入了解。<br />　　下面的几篇博客将会对Java的编译、打包和运行方法由浅入深的进行介绍。<br />　　在这里使用的操作系统是Linux，并提供相应的shell和python脚本。<br /><br />　　首先介绍一下三个常用的命令：javac、jar、java。每个命令都有不同的参数，这些参数的用法会详细介绍。<br /><br />　　<strong style="font-size: 14pt;">1. javac</strong><br style="font-size: 14pt;" />　　javac的功能是对java源代码进行编译，将后缀为.java的文件编译为.class的文件。javac的一般格式是<br /><div>　　javac &lt;选项&gt; &lt;源文件&gt;<br />　　例如：<br />　　javac Main.java<br />　　会产生Main.class文件。<br />　　<br />　　javac的常用选项有：<br /><div>　　-classpath &lt;路径&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定查找用户类文件的位置 <br />　　-cp &lt;路径&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定查找用户类文件的位置（与上面的选项一样，cp是classpath的简写） </div><div>　　-d &lt;目录&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　&nbsp; 指定存放生成的类文件的位置 </div><br />　　<strong style="font-size: 14pt;">2.jar</strong><br style="font-size: 14pt;" />　　jar的功能是根据选项将指定的一些.class文件打包为一个jar包。jar的一般格式是<br /><div>　　jar {ctxui}[vfm0Me] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... </div>　　例如，<br />　　jar cvf Test.jar Main.class Bar.class<br />　　它将Main.class和Bar.class打包为一个文件Test.jar。<br /><br />　　jar命令的选项比较多，用到选项包括: <br /><div>　　-c&nbsp; 创建新的归档文件<br />　　-t&nbsp; 列出归档目录<br />　　-x&nbsp; 从档案中提取指定的 (或所有) 文件<br />　　-u&nbsp; 更新现有的归档文件<br />　　-v&nbsp; 在标准输出中生成详细输出<br />　　-f&nbsp; 指定归档文件名<br />　　-m&nbsp; 包含指定清单文件中的清单信息<br />　　-e&nbsp; 为捆绑到可执行 jar 文件的独立应用程序，指定应用程序入口点<br />　　-C&nbsp; 更改为指定的目录并包含其中的文件，如果有任何目录文件, 则对其进行递归处理。<br /><div><br />　　例如，<br />　　上例中的cvf参数，分别表示创建新的jar文件、创建时显示jar包的信息（可以执行看一下）、指定jar包名为Test.jar。<br />　　jar tf Test.jar&nbsp;&nbsp; &nbsp;&nbsp; 查看Test.jar的内容，其中t表示列出jar包内容，f指定jar包名<br />　　jar xf Test.jar&nbsp;&nbsp; &nbsp;&nbsp; 解压Test.jar文件<br />　　jar xf Test.jar Main.class&nbsp;&nbsp; &nbsp;&nbsp; 仅解压Test.jar中的Main.class文件</div>　　这里要指出的是，f/m/e都指定一个名称（jar包名, 清单文件名和入口点名称），相应的名称顺序与参数的顺序要一致。</div><br />　　<strong style="font-size: 14pt;">3.java</strong><br style="font-size: 14pt;" />　　java的功能是执行应用程序。java的一般格式是<br /><div>　　执行一个类：&nbsp;&nbsp;&nbsp; java [ options ] class [ argument ... ]<br />　　执行一个jar包：java [ options ] -jar file.jar [ argument ... ]</div>　　例如：<br />　　java Main<br />　　执行Main.class，注意上面没有.class后缀<br />　　java Test.jar <br />　　执行一个jar包，这个jar包中要指定了程序入口点（通过在MANIFEST.MF文件中指定）。<br /><br />　　常用的java的选项：<br />　　-classpath&lt;类搜索路径&gt;&nbsp;&nbsp;&nbsp; 指定用户类文件的位置，可能为文件夹、zip、jar文件<br /><br /><br />　　总结<br />　　通过这篇内容，我们应用学会了如何使用javac编译自己的类，并使用java执行自己的类。但是关于打包的操作及jar的执行比较复杂，将在以后继续介绍。<br /><br /><br /></div>　　<img src ="http://www.cppblog.com/jaysoon/aggbug/187508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2012-08-22 15:45 <a href="http://www.cppblog.com/jaysoon/archive/2012/08/22/187508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中计算中文的MD5值</title><link>http://www.cppblog.com/jaysoon/archive/2012/08/17/187484.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Fri, 17 Aug 2012 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2012/08/17/187484.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/187484.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2012/08/17/187484.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/187484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/187484.html</trackback:ping><description><![CDATA[<div>Java中计算中文的MD5值</div> <div> </div> <div>　　前几天的工作中，需要计算中文的MD5值，计算的函数接口及调用方式如下：<br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;String&nbsp;getMD5(</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[]&nbsp;source);<br />String&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">中文编码</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />String&nbsp;md5_value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getMD5(s.getBytes());</span></div></div></div> <div>　　其中getBytes函数使用平台默认的字符集将string编码为byte序列。由于平台的中文编码方式可能不同，所以同一中文经过getBytes得到的二进制是不一样的。为保证每次得到的结果一致，或者使用指定的编码方式得到byte序列，应该在getBytes中使用参数。</div> <div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">String&nbsp;md5_value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getMD5(s.getBytes(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">utf-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));</span></div>        </div> <div>　　这样得到的值就是一样的。</div><img src ="http://www.cppblog.com/jaysoon/aggbug/187484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2012-08-17 15:32 <a href="http://www.cppblog.com/jaysoon/archive/2012/08/17/187484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>遇到java与crontab问题</title><link>http://www.cppblog.com/jaysoon/archive/2012/05/14/174859.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Mon, 14 May 2012 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2012/05/14/174859.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/174859.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2012/05/14/174859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/174859.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/174859.html</trackback:ping><description><![CDATA[<br />　　<span style="font-size: 14pt;">crontab命令是</span><span style="font-size: 14pt;">Unix/Linux中的一个常用命令，用于设置周期性被执行的指令。没有用过的可以查一下，在运行服务端程序时会</span><span style="font-size: 14pt;">经常用到。</span><br /><br />　　<span style="font-size: 14pt;">程序使用Java读取一个含有中文的文件，进行处理后，将结果写到一个结果文件中。在运行的程序时，出现了这样一个问题：在本地环境下，运行正确；但是当使用crontab定时执行时，得到的却是错误的结果。</span><br /><br /><span style="font-size: 14pt;">　　经过一定的调研发现原来是对crontab的机制没有弄明白导致的。crontab运行程序时，会使用它自己的环境变量，这个环境变量与你本地的环境变量可能会不同。比如，在你本地情况下，环境变量的语言为en_US.UTF-8，而在crontab中，环境变量可能是zh_CN.GBK，这样会导致读写文件时&#8212;&#8212;尤其是读写中文文件时内容编码错误，进而导致结果出错。</span><br /><br /><span style="font-size: 14pt;">　　所以在使用Java读写文件时，一定要指定编码格式，而不是使用环境变量的格式。例如下面的语句用于读取utf-8格式的文件</span>：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">String&nbsp;encodeType&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">utf-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />File&nbsp;in_file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test.txt</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />BufferedReader&nbsp;reader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;InputStreamReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileInputStream(in_file),&nbsp;encodeType));</span></div>　　<br />　　<span style="font-size: 14pt;">网上也有关于修改crontab环境变量的方法，但是我不建议使用，因为一个系统可能是很多人共用的，修改crontab环境变量可能会引起他人程序的问题，最好修改自己的程序，保证它不依赖具体的环境变量。<br /><br /><br /><br /></span><img src ="http://www.cppblog.com/jaysoon/aggbug/174859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2012-05-14 15:20 <a href="http://www.cppblog.com/jaysoon/archive/2012/05/14/174859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法的态度</title><link>http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Wed, 20 Jul 2011 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/151515.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/151515.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/151515.html</trackback:ping><description><![CDATA[<p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">很多同学和朋友经常向我抱怨说，算法已经成为他们学习和工作中的一个负担。在他们看来，算法只能应付一下考试，在学习中没有任何用处；也有人说，求职过程中考算法纯粹是浪费精力，在实际工作中没有用到任何算法。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在我的本科四年中，花了大量时间学习算法，参加算法比赛&#8212;&#8212;成绩很滥，朋友们都说，和我的付出严重不成比例，但是我一点也不后悔花费时间学习算法。算法让我在平时的学习中应对各个科目都从容自如，学习起来事半功倍。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在平时的学习交流中，有时看其他人的代码相当别扭，不是看不懂（有时真看不懂），而是很纳闷，为什么要这么写呢，明明有很明显的顺畅的思路，干吗要写这么绕呢？我将我觉得正确的思路写出来的时候，对方也会觉得这样写顺畅了很多，代码也小了很多。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在一般应用中，不会说让你写一个</span><span style="font-size: 14pt;">KMP</span><span style="font-family: 宋体; font-size: 14pt;">算法，或者给你设计一个动态规划的题目让你来解。但是如果你会这些算法，掌握了这种优化的思想，在平时的编写中会不知不觉的写出比较高效的代码。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">有人说，现在中国的软件现状就是这样，不在乎你实现的有多快，只会在乎你有没有实现所有的功能点，随着硬件条件的改善，一般情况下都能满足要求。这样说也是没错，如果你甘愿只做一名码工，因为对于相当大的一部分软件，效率并不是最重要的，甚至第二、第三重要都排不上。但是对于企业级的应用和软件的核心部分，往往效率是非常重要的。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">如果将编程和写作类比的话，可以进行这个的比较。编程必须会语言</span><span style="font-size: 14pt;">C/C++</span><span style="font-family: 宋体; font-size: 14pt;">、</span><span style="font-size: 14pt;">Java</span><span style="font-family: 宋体; font-size: 14pt;">、</span><span style="font-size: 14pt;">Python</span><span style="font-family: 宋体; font-size: 14pt;">等，写作也一定要会一个语言汉语、英语、法语，当然计算机语言有效率的优劣以及适合的应用的场景，而自然语言没有这种属性。算法修养之于编程就像文学修养之于创作，没有一定的文学修养就写不出好的作品，同样没有良好的算法修养也创造不出好的代码。数据结构就像写作中的排比句等，它们是骨架，结构化编程就像是写作中的段落，它们使得层次分明。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在静静的夜晚，明月透过窗子，照进小屋，顿时一种异样的情怀涌上心头。这时有下面几种人，第一种，嚎啕大哭，&#8220;妈妈&#8230;&#8230;&#8221;；第二种，潸然泪下，&#8220;我嚓，想家了是不&#8221;；第三种，沉思状，&#8220;有首诗可以表达这个情怀&#8221;，拿起全唐诗，查找了整晚，夜尽天明时，惊呼&#8220;找到了，原来是&#8216;举头望明月，底头思故乡&#8217;啊，我记得有的。&#8221;；第四种，徘徊低吟&#8220;举头望明月，底头思故乡&#8221;；第五种，心中油然而生，&#8220;独在异乡为异客，明月千里寄乡思&#8221;。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">同样地，这也反映了一个程序员算法修养的几种境界。第一种，菜鸟，不会表达自己的思想，这种多见于初学语言的人，只会写</span><span style="font-size: 14pt;">hello world</span><span style="font-family: 宋体; font-size: 14pt;">之类程序的人；第二种，入门，可以表达出自己的想法，但是不懂什么算法，只是凭自己对计算机语言的理解写程序，当然写出的程序功能点可能不少，但是不完善，潜在的</span><span style="font-size: 14pt;">bug</span><span style="font-family: 宋体; font-size: 14pt;">很多；第三种，有一定的算法基础，但是没有掌握完全，写程序时有高效的意识，对一些核心程序，看着资料也能写出相应的代码，但是不能活学活用；第四种，有不错的算法修养，写出的代码清晰高效，可胜任关键代码的编写；第五种，有很高的算法修养，理解了算法的精髓，自己可以得出算法供世人学习，一般是大师级人物。国内有相当一部分程序员就是处于第二阶段，他们也有稳定的工作，甚至不错的收入，但是总感觉遇到了瓶颈，自己的能力踌躇不前。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">有人说，现在各种库都有，那些代码都非常高效，我只要熟练使用这些库就行了，不用学习算法。可以达到熟练使用几个库的程序员也算是第三阶段，但是要想熟练驾驭更多的库，将库函数熟练的使用，没有一定的算法基础是不行的。比如，如果你想熟练使用</span><span style="font-size: 14pt;">STL</span><span style="font-family: 宋体; font-size: 14pt;">库，那么对各种容器和算法都应该有一定的认识，什么时候使用</span><span style="font-size: 14pt;">list</span><span style="font-family: 宋体; font-size: 14pt;">，为什么快排不能应用于</span><span style="font-size: 14pt;">list</span><span style="font-family: 宋体; font-size: 14pt;">？要想回答这些问题，必须掌握初步的算法。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">对于想要在技术上有一定作为的程序员，没有算法修养，就如同金庸小说中的学武之人不学习内功，它可以将外功学的炉火纯清，凭着这份功力可以走遍半个江湖，但是一旦遇到高手就挂了；反之如果有内功修为，学习外功可学一知十，触类旁通，内功修为越高将来的成就越大。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">学习算法吧！</span></p><img src ="http://www.cppblog.com/jaysoon/aggbug/151515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2011-07-20 23:59 <a href="http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据挖掘中的指数函数</title><link>http://www.cppblog.com/jaysoon/archive/2011/01/21/139062.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Fri, 21 Jan 2011 15:40:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2011/01/21/139062.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/139062.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2011/01/21/139062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/139062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/139062.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size="4">最近做数据时，使用神经网络建模。在神经网络中，会用到激发函数（activation function）。</font></p> <p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 典型的激发函数有Sigmod函数：</font></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cppblog.com/images/cppblog_com/jaysoon/WindowsLiveWriter/f31f2d8e6286_14CDF/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/jaysoon/WindowsLiveWriter/f31f2d8e6286_14CDF/image_thumb.png" width="188" height="75"></a> </p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font size="4">双曲正切函数：</font></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cppblog.com/images/cppblog_com/jaysoon/WindowsLiveWriter/f31f2d8e6286_14CDF/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/jaysoon/WindowsLiveWriter/f31f2d8e6286_14CDF/image_thumb_1.png" width="244" height="88"></a> </p> <p></p> <p></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size="4">这两个都涉及到指数函数，在C中，为求指数函数，使用exp()函数。</font></p> <p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在数次出错后找到问题，原来是我的指数值过大，数据中有时会出现超过1000的数字，这导致在求值过程中，即使使用double型，也使得结果溢出。</font></p> <p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法是定义一个指数函数，当指数值超过一定界限便指定一个相对无穷大的值，这样也符合数学定义。在我的处理中，将界限设定为15，当该值大于15时，返回3000000；当界限值小于-15时，返回0。</font></p><img src ="http://www.cppblog.com/jaysoon/aggbug/139062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2011-01-21 23:40 <a href="http://www.cppblog.com/jaysoon/archive/2011/01/21/139062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置本地文件共享</title><link>http://www.cppblog.com/jaysoon/archive/2010/04/11/112252.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Sun, 11 Apr 2010 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2010/04/11/112252.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/112252.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2010/04/11/112252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/112252.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/112252.html</trackback:ping><description><![CDATA[<span style="font-size: 8pt;"></span><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; <span style="font-size: 14pt;">在配置文件共享时，对没有经验的用户会出现很多问题，这里介绍三点注意事项：<br>&nbsp; &nbsp; 1. 首先打开菜单中&#8220;工具&#8221;-&gt;&#8220;文件夹选项&#8221;-&gt;&#8220;查看&#8221;，确认&#8220;使用简单文件共享&#8221;没有被选上；<br>&nbsp;&nbsp;&nbsp; 2. 右键&#8220;我的电脑&#8221;，&#8220;管理&#8221;-&gt;&#8220;系统工具&#8221;-&gt;&#8220;本地用户和组&#8221;-&gt;&#8220;用户&#8221;，右键&#8220;Guest&#8221;，&#8220;属性&#8221;，在&#8220;常规&#8221;选项卡中，取消&#8220;账户已停用&#8221;；<br>&nbsp; &nbsp; 3. 打开&#8220;控制面板&#8221;-&gt;&#8220;管理工具&#8221;-&gt;&#8220;本地安全策略&#8221;，打开&#8220;本地策略&#8221;-&gt;&#8220;用户权利指派&#8221;，双击&#8220;拒绝从网络访问这台计算机&#8221;，确认其中的&#8220;guest&#8221;已删除。</span><br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 本文针对XP用户，其它用户可参照。<br></span><br> <img src ="http://www.cppblog.com/jaysoon/aggbug/112252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2010-04-11 17:08 <a href="http://www.cppblog.com/jaysoon/archive/2010/04/11/112252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>赋值运算符和复制构造函数</title><link>http://www.cppblog.com/jaysoon/archive/2009/04/29/81477.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Wed, 29 Apr 2009 10:32:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2009/04/29/81477.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/81477.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2009/04/29/81477.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/81477.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/81477.html</trackback:ping><description><![CDATA[<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;赋值运算符</strong>和<strong>复制构造函数</strong>都是用已存在A的对象来创建另一个对象B。不同之处在于：赋值运算符处理两个已有对象，即赋值前B应该是存在的；复制构造函数是生成一个全新的对象，即调用复制构造函数之前B不存在。&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTemp a(b);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//复制构造函数，C++风格的初始化<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTemp a=b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//仍然是复制构造函数，不过这种风格只是为了与C兼容，与上面的效果一样<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这之前a不存在，或者说还未构造好。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTemp a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//赋值运算符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这之前a已经通过默认构造函数构造完成。<br></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我觉得将赋值运算符称为&#8220;<strong>赋值构造函数</strong>&#8221;是错误的，构造函数发生在对象创建时期，而赋值是运算符，发生在&#8220;运算&#8221;时期，赋值运算前，对象已经构造完成，所以不能称之为&#8220;构造函数&#8221;。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一家之言！！
<img src ="http://www.cppblog.com/jaysoon/aggbug/81477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2009-04-29 18:32 <a href="http://www.cppblog.com/jaysoon/archive/2009/04/29/81477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++是类层次保护的</title><link>http://www.cppblog.com/jaysoon/archive/2009/04/29/81474.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Wed, 29 Apr 2009 09:57:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2009/04/29/81474.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/81474.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2009/04/29/81474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/81474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/81474.html</trackback:ping><description><![CDATA[<p>&nbsp;</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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CStack<br /><img id="Codehighlighter1_13_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_13_197_Open_Text.style.display='none'; Codehighlighter1_13_197_Closed_Image.style.display='inline'; Codehighlighter1_13_197_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_13_197_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_13_197_Closed_Text.style.display='none'; Codehighlighter1_13_197_Open_Image.style.display='inline'; Codehighlighter1_13_197_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_13_197_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_13_197_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CStack();&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CStack(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;size);&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CStack(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;CStack</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;st);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">复制构造函数，注意使用引用</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_size;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_count;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;_s;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />CStack::CStack(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;CStack</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;st)<br /><img id="Codehighlighter1_233_622_Open_Image" onclick="this.style.display='none'; Codehighlighter1_233_622_Open_Text.style.display='none'; Codehighlighter1_233_622_Closed_Image.style.display='inline'; Codehighlighter1_233_622_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_233_622_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_233_622_Closed_Text.style.display='none'; Codehighlighter1_233_622_Open_Image.style.display='inline'; Codehighlighter1_233_622_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_233_622_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_233_622_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_size</span><span style="color: #000000">=</span><span style="color: #000000">st._size;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(_size&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img id="Codehighlighter1_283_488_Open_Image" onclick="this.style.display='none'; Codehighlighter1_283_488_Open_Text.style.display='none'; Codehighlighter1_283_488_Closed_Image.style.display='inline'; Codehighlighter1_283_488_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_283_488_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_283_488_Closed_Text.style.display='none'; Codehighlighter1_283_488_Open_Image.style.display='inline'; Codehighlighter1_283_488_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_283_488_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_283_488_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">[_size];<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;st._count;&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">访问st的私有数据</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">_count;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">i)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;st._s[i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img id="Codehighlighter1_516_576_Open_Image" onclick="this.style.display='none'; Codehighlighter1_516_576_Open_Text.style.display='none'; Codehighlighter1_516_576_Closed_Image.style.display='inline'; Codehighlighter1_516_576_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_516_576_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_516_576_Closed_Text.style.display='none'; Codehighlighter1_516_576_Open_Image.style.display='inline'; Codehighlighter1_516_576_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_516_576_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_516_576_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_count&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&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;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在C++模型中，保护是在类层次应用的，而不是在对象层次。<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这句话的意思是，类的任意一个对象可以访问该类的另一个对象的内部的任何东西。在上面的例子中，复制构造函数中的赋值语句_size = st._size;访问了st的私有数据。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这说明，C++中的访问保护是按照层次的原则定义的，那么什么事对象层次的保护呢？<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Smalltalk中，成员函数可以当前对象的私有数据，但不能访问任何其它对象的私有数据，即使它们属于相同的类。<br /></p><img src ="http://www.cppblog.com/jaysoon/aggbug/81474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2009-04-29 17:57 <a href="http://www.cppblog.com/jaysoon/archive/2009/04/29/81474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中关于构造函数的几个问题</title><link>http://www.cppblog.com/jaysoon/archive/2009/04/29/81470.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Wed, 29 Apr 2009 09:45:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2009/04/29/81470.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/81470.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2009/04/29/81470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/81470.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/81470.html</trackback:ping><description><![CDATA[<p>首先我们给出一个类的例子<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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CStack<br><img id=Codehighlighter1_13_201_Open_Image onclick="this.style.display='none'; Codehighlighter1_13_201_Open_Text.style.display='none'; Codehighlighter1_13_201_Closed_Image.style.display='inline'; Codehighlighter1_13_201_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_13_201_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_13_201_Closed_Text.style.display='none'; Codehighlighter1_13_201_Open_Image.style.display='inline'; Codehighlighter1_13_201_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_13_201_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_13_201_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CStack();&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CStack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;size</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CStack(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;CStack</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;st);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">复制构造函数，注意使用引用</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_size;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_count;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;_s;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>CStack::CStack(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;CStack</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;st)<br><img id=Codehighlighter1_237_606_Open_Image onclick="this.style.display='none'; Codehighlighter1_237_606_Open_Text.style.display='none'; Codehighlighter1_237_606_Closed_Image.style.display='inline'; Codehighlighter1_237_606_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_237_606_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_237_606_Closed_Text.style.display='none'; Codehighlighter1_237_606_Open_Image.style.display='inline'; Codehighlighter1_237_606_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_237_606_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_237_606_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_size</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">st._size;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_size&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_287_472_Open_Image onclick="this.style.display='none'; Codehighlighter1_287_472_Open_Text.style.display='none'; Codehighlighter1_287_472_Closed_Image.style.display='inline'; Codehighlighter1_287_472_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_287_472_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_287_472_Closed_Text.style.display='none'; Codehighlighter1_287_472_Open_Image.style.display='inline'; Codehighlighter1_287_472_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_287_472_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_287_472_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[_size];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_count&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;st._count;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">_count;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;st._s[i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_500_560_Open_Image onclick="this.style.display='none'; Codehighlighter1_500_560_Open_Text.style.display='none'; Codehighlighter1_500_560_Closed_Image.style.display='inline'; Codehighlighter1_500_560_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_500_560_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_500_560_Closed_Text.style.display='none'; Codehighlighter1_500_560_Open_Image.style.display='inline'; Codehighlighter1_500_560_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_500_560_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_500_560_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_count&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&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;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_620_655_Open_Image onclick="this.style.display='none'; Codehighlighter1_620_655_Open_Text.style.display='none'; Codehighlighter1_620_655_Closed_Image.style.display='inline'; Codehighlighter1_620_655_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_620_655_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_620_655_Closed_Text.style.display='none'; Codehighlighter1_620_655_Open_Image.style.display='inline'; Codehighlighter1_620_655_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_620_655_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_620_655_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CStack&nbsp;st;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>一. 在<strong>main()</strong>中，对象st不知道该调用哪一个构造函数，因为CStack()和CStack(int&nbsp; size=100)都满足条件，此时正确的编译器会立即标示这种冲突，强迫实现者解决这个问题。</p>
<p>二. 假设我们已经有了一个CStack对象s1<br>CSatck s2=s1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这个句子将会调用复制构造函数<br>CStack s3 = CStack(200);&nbsp;&nbsp;&nbsp;//这个句子将会做什么呢？<br><br>首先，产生一个临时CStack对象，不妨命名为sss，并调用构造函数CStack::CStack(200)，随后执行复制构造函数。也就是说，它相当于<br><br>CStack sss(200);<br>CStack s3(sss);<br><br>这很浪费时间，不过，大多数编译器还是能优化这种语句。但是我们为什么不养成一个好的习惯，直接写成<br>CStack s3(200)呢？<br><br></p>
<img src ="http://www.cppblog.com/jaysoon/aggbug/81470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2009-04-29 17:45 <a href="http://www.cppblog.com/jaysoon/archive/2009/04/29/81470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>