﻿<?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++博客-上善若静水-最新评论</title><link>http://www.cppblog.com/cctoqh/CommentsRSS.aspx</link><description>while(effort=true){success++;}
</description><language>zh-cn</language><pubDate>Thu, 08 Sep 2011 04:01:19 GMT</pubDate><lastBuildDate>Thu, 08 Sep 2011 04:01:19 GMT</lastBuildDate><generator>cnblogs</generator><item><title>re: 对象数组初始化的一种方法[未登录]</title><link>http://www.cppblog.com/cctoqh/archive/2007/12/19/12919.html#39007</link><dc:creator>静水流深</dc:creator><author>静水流深</author><pubDate>Wed, 19 Dec 2007 04:21:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2007/12/19/12919.html#39007</guid><description><![CDATA[@beginner1<br>我测试了一下,上面的有构造函数的初始化方法并没有调用构造函数,而&quot;,要创建类对象数组,则这个类必须有默认构造函数&quot;这句话可能是书上只针对树上给的那个例子的情况__初始化的元素没有给全的情况.<br><br>而拷贝构造函数的调用大体情况有三:<br>一是用一个对象初始化另一个对象是;二是函数返回一个对象赋值时;三是对象作为函数参数值传递时.<br> 按理说上面的拷贝构造函数应该调用,有待进一步研究.........<img src ="http://www.cppblog.com/cctoqh/aggbug/39007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">静水流深</a> 2007-12-19 12:21 <a href="http://www.cppblog.com/cctoqh/archive/2007/12/19/12919.html#39007#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 对象数组初始化的一种方法</title><link>http://www.cppblog.com/cctoqh/archive/2007/12/13/12919.html#38450</link><dc:creator>beginner1</dc:creator><author>beginner1</author><pubDate>Thu, 13 Dec 2007 11:06:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2007/12/13/12919.html#38450</guid><description><![CDATA[看了斑竹的文章，我学会了使用对象数组的初始化，不过我支持&quot;草根“回复的内容。&lt;&lt;C++ Primer Plus》写的下面这段话不对啊！！！！<br>      初始化对象数组的方案是:<br>首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后<br>将临时对象的内容复制到相应的元素中.因此,要创建类对象数组,则这个类必须有默认构造函数.<br>第一对象数组的初始化不一定要求它的类有默认构造函数;<br>第二初始化对象时并不是先调用默认构造函数，然后创建临时对象并用来初始化对象数组。初始化列表是直接指定了初始化对象的构造函数！！！<br>以下程序证明了我的观点，我去掉了默认构造函数，但程序依然正确运行。<br>书上写的不对！<br>#include &lt;iostream&gt; <br>using namespace std; <br>class foo <br>{ <br>private: <br>int num; <br>public: <br>/*foo() <br>{ <br>cout &lt;&lt; &quot;foo default constructing^&quot; &lt;&lt; endl; <br>} */<br>foo(int a) <br>{ <br>num = a; <br>cout &lt;&lt; &quot;foo constructing^ &quot; &lt;&lt; num &lt;&lt; endl; <br>} <br>~foo() <br>{ <br>cout &lt;&lt; &quot;foo desctructing^&quot; &lt;&lt; endl; <br>} <br>}; <br>int main(int argc, char* []) <br>{ <br>foo g[3] = {foo(1),foo(2),foo(3)}; <br>return 0; <br>} <br><br>运行结果：<br>foo constructing^ 1<br>foo constructing^ 2<br>foo constructing^ 3<br>foo desctructing^<br>foo desctructing^<br>foo desctructing^<br>                                                                                          <img src ="http://www.cppblog.com/cctoqh/aggbug/38450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">beginner1</a> 2007-12-13 19:06 <a href="http://www.cppblog.com/cctoqh/archive/2007/12/13/12919.html#38450#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 对象数组初始化的一种方法</title><link>http://www.cppblog.com/cctoqh/archive/2007/04/09/12919.html#21528</link><dc:creator>静水流深</dc:creator><author>静水流深</author><pubDate>Mon, 09 Apr 2007 06:19:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2007/04/09/12919.html#21528</guid><description><![CDATA[   十分对不起，好久没有上网了，没及时回复。<br>  你说的那个匿名对象应该是指构造函数构造的一个临时对象。这个对象在表面是看不见的，使程序的内在机制。<br>  上面的数组是生成十个数组的元素，而我们只给出三个来初始化，其他没有给出的就得调用默认的构造函数。并产生十个临时对象（我们在表面并不知道），然后把这十个对象分别付给数组元素。  我的理解是这样，不明白可以再看一下那本书。<br>  我的那个例子是这样的：<br>#include <iostream> <br>using namespace std; <br>class foo <br>{ <br>private: <br>int num; <br>public: <br>foo() <br>{ <br>cout << "foo default constructing^" << endl; <br>} <br>foo(int a) <br>{ <br>num = a; <br>cout << "foo constructing^ " << num << endl; <br>} <br>~foo() <br>{ <br>cout << "foo desctructing^" << endl; <br>} <br>}; <br>int main(int argc, char* []) <br>{ <br>int aNum = 5;<br>foo g[5] = {foo(1),foo(2),foo()}; <br>return 0; <br>} <br>在VC6.0 下编译的结果为：<br>foo constructing^ 1<br>foo constructing^ 2<br>foo default constructing^<br>foo default constructing^<br>foo default constructing^<br>foo desctructing^<br>foo desctructing^<br>foo desctructing^<br>foo desctructing^<br>foo desctructing^<br><img src ="http://www.cppblog.com/cctoqh/aggbug/21528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">静水流深</a> 2007-04-09 14:19 <a href="http://www.cppblog.com/cctoqh/archive/2007/04/09/12919.html#21528#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 对象数组初始化的一种方法</title><link>http://www.cppblog.com/cctoqh/archive/2007/03/28/12919.html#20805</link><dc:creator>ahlongxp</dc:creator><author>ahlongxp</author><pubDate>Wed, 28 Mar 2007 13:46:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2007/03/28/12919.html#20805</guid><description><![CDATA[@草根<br><br>#include &lt;iostream&gt;<br>using namespace std;<br>class foo<br>{<br>private:<br>	int num;<br>public:<br>	foo()<br>	{<br>		cout &lt;&lt; &quot;foo default constructing^&quot; &lt;&lt; endl;<br>	}<br>	foo(int a)<br>	{<br>		num = a;<br>		cout &lt;&lt; &quot;foo constructing^ &quot; &lt;&lt; num &lt;&lt; endl;<br>	}<br>	~foo()<br>	{<br>		cout &lt;&lt; &quot;foo desctructing^&quot; &lt;&lt; endl;<br>	}<br>};<br>int main(int argc, char* [])<br>{<br>	foo g[] = {foo(1),foo(2),foo()};<br>	return 0;<br>}<br><br>该代码通过g++4.03编译后的运行结果是：<br>foo constructor^ 1<br>foo constructor^ 2<br>foo default constructor^<br>foo destructor^<br>foo destructor^<br>foo destructor^<br><br>因此，结论很明显：没有创建所谓的匿名对象。<img src ="http://www.cppblog.com/cctoqh/aggbug/20805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">ahlongxp</a> 2007-03-28 21:46 <a href="http://www.cppblog.com/cctoqh/archive/2007/03/28/12919.html#20805#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 对象数组初始化的一种方法</title><link>http://www.cppblog.com/cctoqh/archive/2006/12/24/12919.html#16783</link><dc:creator>草根</dc:creator><author>草根</author><pubDate>Sun, 24 Dec 2006 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2006/12/24/12919.html#16783</guid><description><![CDATA[我能问一个问题吗？c++中对象数组的初始化用的是显示调用构造函数，在这个过程中生成了一个匿名对象，这个匿名对象是指什么？如果是构造函数为了初始化对象元素生成的，那也是应该调用拷贝初始化构造函数，为什么要调用构造函数？<br>   请各位高手，帮我解决，<img src ="http://www.cppblog.com/cctoqh/aggbug/16783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">草根</a> 2006-12-24 10:32 <a href="http://www.cppblog.com/cctoqh/archive/2006/12/24/12919.html#16783#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 关于函数 itoa() 使用中的问题</title><link>http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12982</link><dc:creator>周星星</dc:creator><author>周星星</author><pubDate>Tue, 26 Sep 2006 05:40:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12982</guid><description><![CDATA[：）你的问题已经说得很清楚了，而我的回答也丝毫没有错，问题在于你没有看懂我的回答。<br><br>对于第一个问题，你修改常量本身就是不符合逻辑的。如果你记住不再将 const char* cNum = &quot; &quot; 写成 char* cNum = &quot; &quot; 的话，你就能在编译时发现这个错误。<br><br>对于第二个问题，char cNum[1]合法吧？把1改为2，也就是char cNum[2]也合法吧？它们和<br>const unsigned int NO = 1;<br>char cNum[NO]; <br>没有丝毫区别呀，这里的 NO 和 1, 2 都是编译时就能确定的常量。<br><br>“如果NO改为1或者2,则定义一……”<br>--- 语法没有问题，当然编译能通过<br>    对于结果，C/C++没有规定其行为，那么其行为就是未定义的<br>如果C/C++规定其必须运行正确，那么编译器就必须保证编译出来的程序运行正确；<br>如果C/C++规定其必须运行错误，那么编译器就必须保证编译出来的程序运行错误；<br>如果C/C++对其（数组越界）未作定义，那么其行为就看天意。对于未定义的行为应当避免使用，因为其不能保证运行正确，不能保证运行正确 不等于 运行一定错误。<img src ="http://www.cppblog.com/cctoqh/aggbug/12982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">周星星</a> 2006-09-26 13:40 <a href="http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12982#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 关于函数 itoa() 使用中的问题</title><link>http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12977</link><dc:creator>静水流深</dc:creator><author>静水流深</author><pubDate>Tue, 26 Sep 2006 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12977</guid><description><![CDATA[@周星星(谢谢兄弟指点)<br>     都是我的错,没有把问题说清楚,担误了你的时间<br><br>  #include &lt;stdlib.h&gt;<br>   #include &lt;iostream.h&gt;<br>   void main()<br>   {<br>      int num = 123;<br>      const unsigned int NO = 1;  //我的意思是此名NO改为1或2 <br>      char cNum[NO];                 <br>      itoa(num, cNum, 10);<br>      cout&lt;&lt;cNum&lt;&lt;endl;<br>   }<br><br>   我有一个问题:如果NO改为1或者2,则定义一个能存储1个或者2个元素的数组,而字符串为&quot;123&quot;长度为4,怎么能用我定义的这个数组存储?而我用VC6.0编译通过,结果也下常,就是不懂其中的原因,请指教<img src ="http://www.cppblog.com/cctoqh/aggbug/12977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">静水流深</a> 2006-09-26 12:59 <a href="http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12977#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 关于函数 itoa() 使用中的问题</title><link>http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12972</link><dc:creator>静水流深</dc:creator><author>静水流深</author><pubDate>Tue, 26 Sep 2006 04:27:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12972</guid><description><![CDATA[<font color = "blue">@周星星(谢谢兄弟回复)</font><br>  <font color = " red"> 有些符号被翻译成HTML语言了,不能正常显示,希望能看懂</font><br>    我使用的编译环境是VC6.0,如果说把 char *cNum = " ";改为<br>const char *cNum = " "; 那么程序将变为<br>//////////////////////////////////<br> <font color = "red">                   <br>  #include <stdlib.h>                <br>  #include <iostream.h>              <br>   void main()                            <br>   {                                         <br>      int num = 123;                    <br>     const char *cNum = " ";        <br>     itoa(num, cNum, 10);           <br>     cout<<<cNum<<<endl;         <br>   }</font>                               <br><br>/////////////////////////////////////<br>编译器有错误提示:<br>     error C2664: 'itoa' : cannot convert parameter 2 from 'const char *' to 'char *'<br>你说的这个方法好像实施不通.<br><br><img src ="http://www.cppblog.com/cctoqh/aggbug/12972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">静水流深</a> 2006-09-26 12:27 <a href="http://www.cppblog.com/cctoqh/archive/2006/09/26/12932.html#12972#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re 2:</title><link>http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#12941</link><dc:creator>周星星</dc:creator><author>周星星</author><pubDate>Mon, 25 Sep 2006 04:10:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#12941</guid><description><![CDATA[// 使用  const unsigned int NO = 5; char cNum[NO];    NO 的大小可以随意改.为什么?  为什么不可用指针类型的参数传给itoa() 的第二个参数? <br>--- 不明白你是什么意思，NO的值在编译期间就已经确定了，而不是在运行时才确定，所以怎么可以说“NO 的大小可以随意改”？如果你写成 unsigned int NO = 5; 也就是前面没有const，那才应该报错。<br><br>BTW：C99新增了动态数组，也就是<br>unsigned int NO = 5; <br>char cNum[NO]; <br>也可以编译通过，虽然C++中没有此项特性，但某些编译器（比如g++）也允许这样的代码成功运行。<img src ="http://www.cppblog.com/cctoqh/aggbug/12941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">周星星</a> 2006-09-25 12:10 <a href="http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#12941#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re 1:</title><link>http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#12940</link><dc:creator>周星星</dc:creator><author>周星星</author><pubDate>Mon, 25 Sep 2006 04:05:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#12940</guid><description><![CDATA[// 如果将这两条语句改为 char *cNum = &quot;   &quot;;在执行程序时候将会产生严重的错误而终止.<br>---<br>      int num = 123;<br>      const unsigned int NO = 5;<br>      char cNum[NO];<br>      itoa(num, cNum, 10);<br>是不是完全等同于<br>      itoa(123, (char*)&quot;   &quot;, 10);<br>？ 但&quot;   &quot;是个常量字符串，不可以被修改。<br>BTW1：DOS16系统中，内存access没有任何保护措施，所以可以执行通过；<br>BTW2：之所以 char *cNum = &quot;   &quot; 能够编译通过，是为了兼容DOS16遗留下的大量旧代码，你需要自己保证不修改它们。正确的应当写成 const char* cNum = &quot;   &quot;;<img src ="http://www.cppblog.com/cctoqh/aggbug/12940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">周星星</a> 2006-09-25 12:05 <a href="http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#12940#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>