﻿<?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/rosinahua/category/3423.html</link><description>一朝春尽红颜老，花落人亡两不知||寒塘渡鹤影，冷月葬花魂</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 20:46:57 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 20:46:57 GMT</pubDate><ttl>60</ttl><item><title>迭代器的分类</title><link>http://www.cppblog.com/rosinahua/archive/2007/06/13/26227.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Wed, 13 Jun 2007 00:42:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/06/13/26227.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/26227.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/06/13/26227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/26227.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/26227.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 昨天看迭代器看的迷迷糊糊，主要是对分类搞不清楚，为什么这样分，每种迭代器有什么不同？经老公的提醒，在《C++编程思想》第二卷看到如下的解释，拿来与大家共享。<br>&nbsp;&nbsp;&nbsp; 1、输入迭代器：只读，一次传递<br>&nbsp;&nbsp;&nbsp; 为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator，用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析，它们只能向前移动。一个专门的构造函数定义了超越末尾的值。总是，输入迭代器可以对读操作的结果进行解析（对每个值仅解析一次），然后向前移动。<br>&nbsp;&nbsp;&nbsp; 2、输出迭代器：只写，一次传递<br>&nbsp;&nbsp;&nbsp; 这是对输入迭代器的补充，不过是写操作而不是读操作。为输出迭代器的预定义实现只有ostream_iterator和ostreambuf_iterator，用于向一个输出流ostream写数据，还有一个一般较少使用的raw_storage_iterator。他们只能对每个写出的值进行一次解析，并且只能向前移动。对于输出迭代器来说，没有使用超越末尾的值来结束的概念。总之，输出迭代器可以对写操作的值进行解析（对每一个值仅解析一次），然后向前移动。<br>&nbsp;&nbsp;&nbsp; 3、前向迭代器：多次读/写<br>&nbsp;&nbsp;&nbsp; 前向迭代器包含了输入和输出迭代器两者的功能，加上还可以多次解析一个迭代器指定的位置，因此可以对一个值进行多次读/写。顾名思义，前向迭代器只能向前移动。没有为前向迭代器预定义迭代器。<br>&nbsp;&nbsp;&nbsp; 4、双向迭代器：operator--<br>&nbsp;&nbsp;&nbsp; 双向迭代器具有前向迭代器的全部功能。另外它还可以利用自减操作符operator--向后一次移动一个位置。由list容器中返回的迭代器都是双向的。<br>&nbsp;&nbsp;&nbsp; 5、随机访问迭代器：类似于一个指针<br>&nbsp;&nbsp;&nbsp; 随机访问迭代器具有双向迭代器的所有功能，再加上一个指针所有的功能（一个指针就是一个随机访问迭代器），除了没有一种&#8220;空（null）&#8221;迭代器和空指针对应。基本上可以这样说，一个随机访问迭代器就像一个指针那样可以进行任何操作，包括使用操作符operator[]进行索引，加某个数值到一个指针就可以向前或者向后移动若干个位置，或者使用比较运算符在迭代器之间进行比较。 
<img src ="http://www.cppblog.com/rosinahua/aggbug/26227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-06-13 08:42 <a href="http://www.cppblog.com/rosinahua/archive/2007/06/13/26227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vector中存放const变量是否有意义</title><link>http://www.cppblog.com/rosinahua/archive/2007/06/05/25584.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Tue, 05 Jun 2007 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/06/05/25584.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/25584.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/06/05/25584.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/25584.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/25584.html</trackback:ping><description><![CDATA[<p>vector&lt;const int&gt; cVec;<br>&nbsp;cVec.push_back(10);<br>&nbsp;cVec.push_back(20);</p>
<p>&nbsp;int&amp; firstVal = cVec.front();</p>
<p>&nbsp;cout&lt;&lt;"The first element is :"&lt;&lt;firstVal&lt;&lt;endl;</p>
<p>&nbsp;firstVal++;</p>
<p>&nbsp;firstVal = cVec.front();</p>
<p>&nbsp;cout&lt;&lt;"The first element is :"&lt;&lt;firstVal&lt;&lt;endl;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 鬼使神差的写了上面的代码，发现这样很容易改变了vector中的第一个元素的值，即使vector的模板参数是const int，不知道是忽略了这个问题，还是有别的目的，希望各位对STL有深入研究的人，指教下，谢谢！</p>
<img src ="http://www.cppblog.com/rosinahua/aggbug/25584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-06-05 18:15 <a href="http://www.cppblog.com/rosinahua/archive/2007/06/05/25584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>msdn也有错？</title><link>http://www.cppblog.com/rosinahua/archive/2007/06/04/25430.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Mon, 04 Jun 2007 01:50:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/06/04/25430.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/25430.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/06/04/25430.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/25430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/25430.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 今天看vector的front这个函数msdn中的例子，给出的例程是这样的：<br>// vector_front.cpp<br>// compile with: /EHsc<br>#include &lt;vector&gt;<br>#include &lt;iostream&gt;</p>
<p>int main( )<br>{<br>&nbsp;&nbsp; using namespace std;&nbsp;&nbsp; <br>&nbsp;&nbsp; vector &lt;int&gt; v1;<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; v1.push_back( 10 );<br>&nbsp;&nbsp; v1.push_back( 11 );</p>
<p>&nbsp;&nbsp; int&amp; i = v1.front( );<br>&nbsp;&nbsp; const int&amp; ii = v1.front( );</p>
<p>&nbsp;&nbsp; cout &lt;&lt; "The first integer of v1 is "&lt;&lt; i &lt;&lt; endl;<br>&nbsp;&nbsp; i++;<br>&nbsp;&nbsp; cout &lt;&lt; "The second integer of v1 is "&lt;&lt; ii &lt;&lt; endl;<br>}<br>vector::back这个函数给出的例程如下：<br>// vector_back.cpp<br>// compile with: /EHsc<br>#include &lt;vector&gt;<br>#include &lt;iostream&gt;</p>
<p>int main( )<br>{<br>&nbsp;&nbsp; using namespace std;&nbsp;&nbsp; <br>&nbsp;&nbsp; vector &lt;int&gt; v1;<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; v1.push_back( 10 );<br>&nbsp;&nbsp; v1.push_back( 11 );</p>
<p>&nbsp;&nbsp; int&amp; i = v1.back( );<br>&nbsp;&nbsp; const int&amp; ii = v1.front( );</p>
<p>&nbsp;&nbsp; cout &lt;&lt; "The last integer of v1 is " &lt;&lt; i &lt;&lt; endl;<br>&nbsp;&nbsp; i--;<br>&nbsp;&nbsp; cout &lt;&lt; "The next-to-last integer of v1 is "&lt;&lt; ii &lt;&lt; endl;<br>}<br><br>&nbsp;&nbsp;&nbsp; 其中front函数例程里面，两个输出the first integer和the second integer意思是i是v1中的第一个元素的引用，而ii是v1中第二个元素的引用？back函数例程里面，the last integer和the next-to-last integer两句也是同样的道理。可是front应该都是v1中第一个元素的引用，只是i++;这句之后，ii引用的元素增加了1，恰好和v1中的第二个元素的值相同而已。<br>&nbsp;&nbsp;&nbsp; 不知道是我的理解有问题，还是真的有问题，各位请指教。<br></p>
<img src ="http://www.cppblog.com/rosinahua/aggbug/25430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-06-04 09:50 <a href="http://www.cppblog.com/rosinahua/archive/2007/06/04/25430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dynamic_cast</title><link>http://www.cppblog.com/rosinahua/archive/2007/05/31/25179.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Thu, 31 May 2007 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/05/31/25179.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/25179.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/05/31/25179.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/25179.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/25179.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 运算符dynamic_cast可以针对两种数据类型做强制转换：指针类型和引用类型。这两种类型的情况是不一样的。下面讨论如下：<br>1、对指针的强制转换<br>&nbsp;&nbsp;&nbsp; dynamic_cast&lt;T*&gt;(p);<br>&nbsp;&nbsp;&nbsp; 如果p的类型为T*，或者为D*，且T是D的一个可以访问的基类，结果跟我们直接将p赋给一个T*是一样的。（这是向上类型转换的情况）。<br>&nbsp;&nbsp;&nbsp;dynaimic_cast的专长是用于那些编译器无法确定转换正确性的情况。在这种情况下dynamic_cast将查看被p指向的对象（如果有的话），如果这个对象属于类T，或者有唯一的基类T，那么dynamic_cast就返回指向该对象的类型为T*的指针。否则就返回0。如果p的值为0，则dynamic_cast&lt;T*&gt;(p)也返回0。<br>&nbsp;&nbsp;&nbsp; 如果要做向下的类型转换，或者兄弟类之间做交叉转换，则要求p是一个到多态类型的指针或引用。但是转换的目标类型不一定是支持多态的。因为如果p的类型不是T的，那么返回值为0，这样的话，我们对dynamic_cast&lt;T*&gt;(p)的返回值必须做显示的检查。对于指针p，dynamic_cast&lt;T*&gt;(p)可以看成一个疑问：p所指向的对象的类型是T吗？<br>2、对引用的强制转换<br>&nbsp;&nbsp;&nbsp;因为我们能合法的假定一个引用总是引用着某个对象，因此对引用r做dynamic_cast&lt;T&amp;&gt;(r)不是提问，而是断言：&#8220;由r引用的对象的类型是T&#8221;。对于引用的dynamic_cast的结果，隐式的由dynamic_cast去做检查，如果对引用的dynamic_cast不具有所需要的类型，就会跑出一个bad_cast异常。<br>&nbsp;&nbsp;&nbsp; 在对动态指针强制转换和动态引用强制转换结果方面的差异，所反应的正是指针和引用之间的根本性差异。 
<img src ="http://www.cppblog.com/rosinahua/aggbug/25179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-05-31 10:43 <a href="http://www.cppblog.com/rosinahua/archive/2007/05/31/25179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>new的三中使用方法</title><link>http://www.cppblog.com/rosinahua/archive/2007/04/03/21183.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Tue, 03 Apr 2007 09:31:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/04/03/21183.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/21183.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/04/03/21183.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/21183.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/21183.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; new有三种使用方式：plain new，nothrow new和placement new。<br>（1）plain new顾名思义就是普通的new，就是我们惯常使用的new。在C++中是这样定义的：<br>&nbsp;&nbsp;&nbsp; void* operator new(std::size_t) throw(std::bad_alloc);<br>&nbsp;&nbsp;&nbsp; void operator delete(void *) throw();<br>提示：plain new在分配失败的情况下，抛出异常std::bad_alloc而不是返回NULL，因此通过判断返回值是否为NULL是徒劳的。<br>（2）nothrow new是不抛出异常的运算符new的形式。nothrow new在失败时，返回NULL。定义如下：<br>&nbsp;&nbsp;&nbsp; void * operator new(std::size_t,const std::nothrow_t&amp;) throw();<br>&nbsp;&nbsp;&nbsp; void operator delete(void*) throw();<br>（3）placement new意即&#8220;放置&#8221;，这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败，因为它根本不分配内存，它做的唯一一件事情就是调用对象的构造函数。定义如下：<br>&nbsp;&nbsp;&nbsp; void* operator new(size_t,void*);<br>&nbsp;&nbsp;&nbsp; void operator delete(void*,void*);<br>提示1：palcement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。<br>提示2：placement new构造起来的对象或其数组，要显示的调用他们的析构函数来销毁，千万不要使用delete。<br>char* p = new(nothrow) char[100];<br>long *q1 = new(p) long(100);<br>int *q2 = new(p) int[100/sizeof(int)];<br>
<img src ="http://www.cppblog.com/rosinahua/aggbug/21183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-04-03 17:31 <a href="http://www.cppblog.com/rosinahua/archive/2007/04/03/21183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>auto_ptr复制</title><link>http://www.cppblog.com/rosinahua/archive/2007/04/02/21098.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Mon, 02 Apr 2007 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/04/02/21098.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/21098.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/04/02/21098.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/21098.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/21098.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr在退出作用域时，它所指的对象将被自动的隐式删除。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr具有与常规指针很不一样的复制语义：在将一个auto_ptr复制给另一个之后，原来的那个auto_ptr将不再指向任何东西。因为复制auto_ptr将导致它本身的修改，因此const auto_ptr不能被复制。<br>&nbsp;&nbsp;&nbsp; 如果指针D*能被转换到B*，模板构造函数和模板赋值都能将auto_ptr&lt;D&gt;转换到auto_ptr&lt;B&gt;。<br>&nbsp;&nbsp;&nbsp; 针对此问题，举例如下：<br>void g(Circle* pc)<br>{<br>&nbsp;&nbsp;&nbsp;auto_ptr&lt;Circle&gt; p2(pc);&nbsp; //现在p2负责删除<br>&nbsp;&nbsp; auto_ptr&lt;Circle&gt; p3(p2); //现在p3负责删除，且p2不再负责<br>&nbsp;&nbsp;&nbsp;Shape* ps = p3.Get();&nbsp; //从auto_ptr抽取指针<br>&nbsp;&nbsp;&nbsp;auto_ptr&lt;Shape&gt;&nbsp;aps(p3); //转移所有权，并转换类型，现在aps负责删除，且p3不再负责<br>}
<img src ="http://www.cppblog.com/rosinahua/aggbug/21098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-04-02 17:20 <a href="http://www.cppblog.com/rosinahua/archive/2007/04/02/21098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储描述符mutable</title><link>http://www.cppblog.com/rosinahua/archive/2007/02/11/18628.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Sun, 11 Feb 2007 00:35:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/02/11/18628.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/18628.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/02/11/18628.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/18628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/18628.html</trackback:ping><description><![CDATA[    存储描述符mutable用来特别说明某个类的成员变量需要以一种允许更新的方式存储－－即使它是某个const对象的成员。换言之，mutable意味着“不可能是const”。<br />    举例如下：<br />class Test<br />{<br />  public:<br />void SetValue(int i) const {m_i=i;}<br />private:<br />mutable int m_i;<br />};<br />    上面的代码在使用的时候是没有问题的，但是如果int m_i的定义去掉mutable，则会出现 “error C2166: l 值指定常数对象”这样的错误提示。<br />    可能有朋友说，可以通过const_cast 之类的转换实现，但是这个运算符并不是总能正确的转换的。<img src ="http://www.cppblog.com/rosinahua/aggbug/18628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-02-11 08:35 <a href="http://www.cppblog.com/rosinahua/archive/2007/02/11/18628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>this指针</title><link>http://www.cppblog.com/rosinahua/archive/2007/02/10/18602.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Sat, 10 Feb 2007 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/02/10/18602.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/18602.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/02/10/18602.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/18602.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/18602.html</trackback:ping><description><![CDATA[    在一个非静态的成员里面，this关键字就是一个指针，指向该函数的这次调用所针对的那个对象。<br />    在类X的非const成员函数里，this的类型就是X*，然而this并不是一个常规变量，不能获取this的地址或者给它赋值。<br />    在类X的const成员函数里，this的类型就是const X*，以防止对这个对象本身的修改。<img src ="http://www.cppblog.com/rosinahua/aggbug/18602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-02-10 11:12 <a href="http://www.cppblog.com/rosinahua/archive/2007/02/10/18602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全局变量的初始化</title><link>http://www.cppblog.com/rosinahua/archive/2007/02/08/18521.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Thu, 08 Feb 2007 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/02/08/18521.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/18521.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/02/08/18521.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/18521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/18521.html</trackback:ping><description><![CDATA[    对于不同编译单位的全局变量，其初始化的顺序没有任何的保证，因此对不通编译单位里的全局变量，在它们的初始化顺序之间建立依赖性都是不明智的。<br />    此外也没办法捕捉到全局变量初始化抛出的异常，一般来说要减少全局变量的使用，特别是限制那些要求复杂初始化的全局变量。<img src ="http://www.cppblog.com/rosinahua/aggbug/18521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-02-08 10:28 <a href="http://www.cppblog.com/rosinahua/archive/2007/02/08/18521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>名字空间组合</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/31/18200.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Wed, 31 Jan 2007 02:02:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/31/18200.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/18200.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/31/18200.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/18200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/18200.html</trackback:ping><description><![CDATA[namespace His_string<br />{<br />   class String {/*..............*/};<br />   String operator+ (const String&amp;,const String);<br />   String operator+ (const String&amp;,const char*);<br />   void fill(char);<br />   //....<br />}<br /><br />namespace My_lib<br />{<br />   using namespace His_String;<br />   void My_fat(String&amp;);<br />}<br />    有了这些，我们就可以在My_lib的基础上写程序了<br />void f()<br />{<br />   My_lib::String s="test";  //可以，找到My_lib::His_string::String<br />}<br /><font color="#006400">如果显示限定的名字（My_lib::String）在所说的名字空间里没有声明，编译器就会去查看<font color="#ff1493">使用指令</font>说到的名字空间。<br /></font><font color="#000000">void My_lib::fill(char c)  //错误，在My_lib里面没有声明fill<br />{<br />   <br />}<br /></font><font color="#006400">在我们需要定义什么东西的时候，需要知道一个实体所在的真实的名字空间。</font><img src ="http://www.cppblog.com/rosinahua/aggbug/18200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-31 10:02 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/31/18200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>名字空间别名</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/30/18164.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Tue, 30 Jan 2007 01:29:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/30/18164.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/18164.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/30/18164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/18164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/18164.html</trackback:ping><description><![CDATA[    如果一个名字空间的名字过长，则在实际代码中不是很实用，最起码用起来不方便。例如：America_Telephone_And_Telegraph。我们可以用别名给变成带来方便。<br />namespace ATT=America_Telephone_And_Telegraph;<br />这样用ATT来访问这个名字空间中的函数的时候就比较方便了。<br />    名字空间别名还有一个比较好的用处是，使用户可以引用“某一个版本的库”，例如：namespace Lib=Foundation_Library_V2r11;这样将使用一个版本的库代替另一个版本非常简化，通过使用Lib而不是Foundation_Library_V2r11，当你需要更新到版本"V3r11"的时候，只需要修改Lib的初始化并重新编译。<br /><img src ="http://www.cppblog.com/rosinahua/aggbug/18164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-30 09:29 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/30/18164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可变参数的实现</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/25/17969.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Thu, 25 Jan 2007 00:39:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/25/17969.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/17969.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/25/17969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/17969.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/17969.html</trackback:ping><description><![CDATA[    void error(int severity...)<br />{<br />   va_list ap;<br />   va_start(ap,severity);<br />   for(;;)<br />   {<br />      char* p=va_arg(ap,char*);<br />      if(p==0) break;<br />      cerr&lt;&lt;p&lt;&lt;' ';<br />   }<br />   va_end(ap);<br />   cerr&lt;&lt;'\n';<br />   if(severity) exit(severity);<br />}<br />    首先，通过调用va_start定义并初始化一个va_list，宏va_start以一个va_list的名字和函数的最后一个有名形参的名字作为参数。宏va_arg用户按顺序取出各个无名参数。在每次调用va_arg时，程序员都必须提供一个类型，va_arg假定这就是被传递的实际参数的类型，但一般说它并没有办法保证这一点。从一个使用过va_start的函数退出之前，必须调用一次va_end，这是因为va_start可能以某种形式修改了堆栈，这种修改可能导致返回无法完成，va_end能将有关的修改复原。<img src ="http://www.cppblog.com/rosinahua/aggbug/17969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-25 08:39 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/25/17969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重载函数的参数匹配</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/24/17954.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Wed, 24 Jan 2007 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/24/17954.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/17954.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/24/17954.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/17954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/17954.html</trackback:ping><description><![CDATA[
		<p>    要从一组重载函数中找到应实际调用的那个正确版本，就需要找到实参和形参的最好匹配。一般遵循下面一些列的判断准则：<br />（1）准确匹配。也就是说无须任何转换或者只进行平凡转换的匹配。（平凡转换：从数组名到指针，从函数名到函数指针，从T到const T之类的）<br />（2）利用提升的匹配。比如整数提升（从bool到int，从char到int，shot到int之类）或者从float到double的提升。<br />（3）利用标准转换的匹配。例如：int到double，double到int，double到long double，derived*到base*，T*到void*之类。<br />（4）利用用户定义的转换的匹配。<br />（5）利用在函数声明中用到的...的匹配。<br />    如果能在找到匹配的某个最高的层次上同时发现了两个匹配，这个调用将被作为歧义而被拒绝。</p>
<img src ="http://www.cppblog.com/rosinahua/aggbug/17954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-24 11:47 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/24/17954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>普通引用和const引用的初始化</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/15/17632.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Mon, 15 Jan 2007 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/15/17632.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/17632.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/15/17632.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/17632.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/17632.html</trackback:ping><description><![CDATA[    当引用的初始式是一个左值（是一个对象，你可以取得他的地址）时，其初始化就是非常简单的事情。普通T&amp;的初始式必须是一个T类型的。而cosnt T&amp;则不必是一个左值，甚至可以不是T类型的。在这样的情况下，经过以下几个步骤。<br />    （1）首先，如果需要的话，将应用到类型T的隐式类型转换。<br />    （2）而后，将结果存入一个类型T的临时变量。<br />    （3）最后，将此临时变量用作初始化的值。<br />例如<br />double&amp; d=1;  //错误，初始式必须式左值<br />const double&amp; cd=1;  //ok<br />对后一个初始化的解释是：<br />double temp=double(1);   // 首先建立一个具有正确数据类型的临时变量<br />const double&amp; cd=temp;  //而后用这个临时变量作为cd的初始式<img src ="http://www.cppblog.com/rosinahua/aggbug/17632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-15 11:03 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/15/17632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针和常量</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/15/17630.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Mon, 15 Jan 2007 02:45:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/15/17630.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/17630.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/15/17630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/17630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/17630.html</trackback:ping><description><![CDATA[    使用一个指针时，涉及到两个对象：该指针本身和被它所指的对象。将一个指针的声明用const“预先固定”，将使那个对象而不是这个指针成为常量，要使指针而不是被指的那个对象成为常量，我们必须使用声明运算符*const。<br />    void f(char* p)<br />{<br />   char s[]="Gorm";<br />   <br />   const char* pc=s;   //指向常量<br />   pc[3]='g';               //错误，pc是指向常量的<br />   pc=p;                     //   ok<br />   <br />   char* const cp=s;   //常量指针<br />   cp[2]='c';               //ok<br />   cp=p;                     //cp是常量指针<br /><br />   const char* const cpc=s;  //指向常量的常量指针<br />   cpc[2]='g';                       //错误，cpc指向常量<br />   cpc=p;                            //错误，cpc是常量指针<br />} <br />     定义常量指针的声明运算符是*const，没有const*声明符，所以出现在*之前的const是作为基础类型的一部分。<br />    char* const cp;   //到char的const指针<br />    const char* pc;   //到const char的指针<br />    char const* pc2;  //到const char的指针<br />    有人发现从右向左读这样的定义是有帮助的。例如：cp is a const pointer to char and pc is a pointer to const char。<img src ="http://www.cppblog.com/rosinahua/aggbug/17630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-15 10:45 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/15/17630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>枚举的表示范围</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/10/17476.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Wed, 10 Jan 2007 00:52:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/10/17476.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/17476.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/10/17476.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/17476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/17476.html</trackback:ping><description><![CDATA[    枚举符也可以用整型的常量表达式进行初始化。如果某个枚举中所有枚举值均非负，该枚举的表示范围就是[0:2^k-1]，其中2^k能使所有枚举符位于此范围内的最小的2的幂。如果存在负的枚举符值，该枚举的表示范围就是[-2^k,2^k-1]。<br />    一个整型值可以显示的转换成一个枚举值，除非这种转换的结果位于枚举的表示范围之内，否则就是无定义的。举例如下：<br />enum flag {x=1,y=2,z=4,e=8};  //表示范围为0:15<br />flag f1=5;  //类型错，5不是flag类型<br />flag f1=flag(5);  //可以，flag(5)是flag类型且在flag的表示范围内<br />flag f1=flag(99);  //无定义，99不在flag的表示范围内<br /><br />    一个枚举的sizeof就是某个能够容纳其范围的整型的sizeof，而且不会大于sizeof(int)。<br /><br /><br />    <img src ="http://www.cppblog.com/rosinahua/aggbug/17476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-10 08:52 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/10/17476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>找到我的C++空间</title><link>http://www.cppblog.com/rosinahua/archive/2007/01/09/17460.html</link><dc:creator>探丫头</dc:creator><author>探丫头</author><pubDate>Tue, 09 Jan 2007 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/rosinahua/archive/2007/01/09/17460.html</guid><wfw:comment>http://www.cppblog.com/rosinahua/comments/17460.html</wfw:comment><comments>http://www.cppblog.com/rosinahua/archive/2007/01/09/17460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/rosinahua/comments/commentRss/17460.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rosinahua/services/trackbacks/17460.html</trackback:ping><description><![CDATA[    虽然在几个博客网站都有自己的博客，但是总感觉不是那么舒服，要么不是专业的C++博客网站，要么就是速度不行，来到这里给我一种耳目一新的感觉，让我很兴奋，希望在这里能结交更多的学习研究C++，以及从事C++开发工作的朋友。<br />    本人先做一下自我介绍：从事C++开发近三年，但是却仍是菜鸟一只，希望这里的朋友能给出比较专业的指导，对我不正确的认识提出积极的批评，希望大家多多交流。<br />    我的msn：huahua8111@hotmail.com <img src ="http://www.cppblog.com/rosinahua/aggbug/17460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rosinahua/" target="_blank">探丫头</a> 2007-01-09 15:12 <a href="http://www.cppblog.com/rosinahua/archive/2007/01/09/17460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>