??xml version="1.0" encoding="utf-8" standalone="yes"?>久久av高潮av无码av喷吹,久久婷婷国产麻豆91天堂,久久发布国产伦子伦精品http://www.shnenglu.com/maosher/category/10169.htmlzh-cnFri, 18 Feb 2011 12:53:07 GMTFri, 18 Feb 2011 12:53:07 GMT60新手的时候碰到的预处理命?/title><link>http://www.shnenglu.com/maosher/archive/2011/02/17/140191.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Wed, 16 Feb 2011 16:04:00 GMT</pubDate><guid>http://www.shnenglu.com/maosher/archive/2011/02/17/140191.html</guid><wfw:comment>http://www.shnenglu.com/maosher/comments/140191.html</wfw:comment><comments>http://www.shnenglu.com/maosher/archive/2011/02/17/140191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/maosher/comments/commentRss/140191.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/maosher/services/trackbacks/140191.html</trackback:ping><description><![CDATA[今天一个新同学来问一个典型的预处理的问题Q我当年也碰到这L问题Q脓出来Q让更多的h能直接搜?br><br> <h1>预处理命?/h1> <hr> <h2><a name="">#,## </a></h2> <p># ?## 操作W是?a href="mk:@MSITStore:E:\doc\C++%20语言参?chm::/cppreference.com/preproc_details.html#define"><u><font color=#810081>#define</font></u></a>宏用的. 使用# 使在#后的首个参数q回Z个带引号的字W串. 例如, 命o </p> <pre> #define to_string( s ) # s </pre> <p>会使编译器把以下命?</p> <pre> cout << to_string( Hello World! ) << endl; </pre> <p>理解?</p> <pre> cout << "Hello World!" << endl; </pre> <p>使用##q结##前后的内? 例如, 命o </p> <pre> #define concatenate( x, y ) x ## y ... int xy = 10; ... </pre> <p>会使编译器?</p> <pre> cout << concatenate( x, y ) << endl; </pre> <p>解释?</p> <pre> cout << xy << endl; </pre> <p>理所当然,会在标准输出处昄'10'.</p> <br><br> <h2><a name=line>#line</a> </h2> <em>语法:</em> <table bgColor=#ccccff> <tbody> <tr> <td> <pre> #line line_number "filename" </pre> </td> </tr> </tbody> </table> <p>#line命o是用于更改__LINE__ ?__FILE__变量的? 文g名是可选的. __LINE__ ?__FILE__ 变量描述被读取的当前文g和行. 命o </p> <pre> #line 10 "main.cpp" </pre> <p>更改行号?0,当前文g改ؓ"main.cpp". <br><br><br></p> <h2><a name=predefined>预定义变?/a> </h2> <p><em>语法:</em> <table bgColor=#ccccff> <tbody> <tr> <td> <pre> __LINE__ __FILE__ __DATE__ __TIME__ _cplusplus __STDC__ </pre> </td> </tr> </tbody> </table> </p> <p>下列参数在不同的~译器可能会有所不同, 但是一般是可用? <ul> <li>__LINE__ ?__FILE__ 变量表示正在处理的当前行和当前文? <li>__DATE__ 变量表示当前日期,格式?em>month/day/year</em>(??q?. <li>__TIME__ 变量描述当前的时?格式?em>hour:minute:second</em>(??U?. <li>_cplusplus 变量只在~译一个C++E序时定? <li>__STDC__ 变量在编译一个CE序时定?~译C++时也有可能定? </li> </ul> <br> <img src ="http://www.shnenglu.com/maosher/aggbug/140191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/maosher/" target="_blank">Brandon</a> 2011-02-17 00:04 <a href="http://www.shnenglu.com/maosher/archive/2011/02/17/140191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>好吧Q我被征服了—?关于 c++ unsigned char http://www.shnenglu.com/maosher/archive/2011/02/13/139977.htmlBrandonBrandonSun, 13 Feb 2011 08:12:00 GMThttp://www.shnenglu.com/maosher/archive/2011/02/13/139977.htmlhttp://www.shnenglu.com/maosher/comments/139977.htmlhttp://www.shnenglu.com/maosher/archive/2011/02/13/139977.html#Feedback0http://www.shnenglu.com/maosher/comments/commentRss/139977.htmlhttp://www.shnenglu.com/maosher/services/trackbacks/139977.html1 unsigned char i;
2 i=-20;
3  上面一D很单的代码Q如果输Z是什?呢?
今天里的新学c++同学问我Qunsighed char 和char 有啥区别Q上面的输出会有什?不同
在这里,我先鄙视一下自己,我直观的理解为通常?首位W号位,然后丢下的就是输入无W号的。好吧,估计各位看官说我太菜Q但实是输出的l果和我想的不大一P如果各位没明白我说的是什么问题,可以试一下。然后回来看下面的内宏V?br>











?br>

In an unsigned type, all the bits represent the value. If a type is defined for a particular machine to use 8 bits, then the unsigned version of this type could hold the values 0 through 255.

无符号型中,所有的位都表示数倹{如果在某种机器中,定义一U类型?8 位表C,那么q种cd? unsigned 型可以取?0 ?255?/p>

The C++ standard does not define how signed types are represented at the bit level. Instead, each compiler is free to decide how it will represent signed types. These representations can affect the range of values that a signed type can hold. We are guaranteed that an 8-bit signed type will hold at least the values from 127 through 127; many implementations allow values from 128 through 127.

C++ 标准q未定义 signed cd如何用位来表C,而是由每个编译器自由军_如何表示 signed cd。这些表C方式会影响 signed cd的取D围? ?signed cd的取D定至是?-127 ?127Q但也有许多实现允许取g -128 ?127?/p>

Under the most common strategy for representing signed integral types, we can view one of the bits as a sign bit. Whenever the sign bit is 1, the value is negative; when it is 0, the value is either 0 or a positive number. An 8-bit integral signed type represented using a sign-bit can hold values from 128 through 127.

表示 signed 整型cd最常见的策略是用其中一个位作ؓW号位。符号位?1Q值就敎ͼW号位ؓ 0Q值就?0 或正数。一?signed 整型取值是?-128 ?127?/p>

Assignment to Integral Types
整型的赋?/h5>

The type of an object determines the values that the object can hold. This fact raises the question of what happens when one tries to assign a value outside the allowable range to an object of a given type. The answer depends on whether the type is signed or unsigned.

对象的类型决定对象的取倹{这会引起一个疑问:当我们试着把一个超出其取D围的Dl一个指定类型的对象Ӟl果会怎样呢?{案取决于这U类型是 signed q是 unsigned 的?/p>

For unsigned types, the compiler must adjust the out-of-range value so that it will fit. The compiler does so by taking the remainder of the value modulo the number of distinct values the unsigned target type can hold. An object that is an 8-bit unsigned char, for example, can hold values from 0 through 255 inclusive. If we assign a value outside this range, the compiler actually assigns the remainder of the value modulo 256. For example, we might attempt to assign the value 336 to an 8-bit signed char. If we try to store 336 in our 8-bit unsigned char, the actual value assigned will be 80, because 80 is equal to 336 modulo 256.

对于 unsigned cd来说Q编译器必须调整界g其满求。编译器会将该值对 unsigned cd的可能取值数目求模,然后取所得倹{比?8 位的 unsigned charQ其取D围从 0 ? 255Q包?255Q。如果赋l超个范围的|那么~译器将会取该值对 256 求模后的倹{例如,如果试图?336 存储?8 位的 unsigned char 中,则实际赋gؓ 80Q因?80 ?336 ?256 求模后的倹{?/p>

For the unsigned types, a negative value is always out of range. An object of unsigned type may never hold a negative value. Some languages make it illegal to assign a negative value to an unsigned type, but C++ does not.

对于 unsigned cd来说Q负数L出其取D围?tt>unsigned cd的对象可能永q不会保存负数。有些语a中将负数赋给 unsigned cd是非法的Q但?C++ 中这是合法的?/p>


In C++ it is perfectly legal to assign a negative number to an object with unsigned type. The result is the negative value modulo the size of the type. So, if we assign 1 to an 8-bit unsigned char, the resulting value will be 255, which is 1 modulo 256.

C++ 中,把负Dl?unsigned 对象是完全合法的Q其l果是该负数对该cd的取g数求模后的倹{所以,如果?-1 赋给8位的 unsigned charQ那么结果是 255Q因?255 ?-1 ?256 求模后的倹{?/p>



When assigning an out-of-range value to a signed type, it is up to the compiler to decide what value to assign. In practice, many compilers treat signed types similarly to how they are required to treat unsigned types. That is, they do the assignment as the remainder modulo the size of the type. However, we are not guaranteed that the compiler will do so for the signed types.

当将过取D围的Dl?signed cdӞq译器军_实际赋的倹{在实际操作中,很多的编译器处理 signed cd的方式和 unsigned cdcM。也是_赋值时是取该值对该类型取值数目求模后的倹{然而我们不能保证编译器都会q样处理 signed cd?/p>



以上摘自 c++ primer,惭愧Q还是再l细的从头品一ơ这书吧?br>











Brandon 2011-02-13 16:12 发表评论
]]>c语言中可变参数函数的设计http://www.shnenglu.com/maosher/archive/2010/06/17/118126.htmlBrandonBrandonThu, 17 Jun 2010 15:52:00 GMThttp://www.shnenglu.com/maosher/archive/2010/06/17/118126.htmlhttp://www.shnenglu.com/maosher/comments/118126.htmlhttp://www.shnenglu.com/maosher/archive/2010/06/17/118126.html#Feedback0http://www.shnenglu.com/maosher/comments/commentRss/118126.htmlhttp://www.shnenglu.com/maosher/services/trackbacks/118126.html
我们知道函数调用旉会分配栈I间Q而函数调用机制中的栈l构如下图所C:

                       |     ......     |

                       ------------------

                       |     参数2      |

                       ------------------

                       |     参数1      |

                       ------------------

                       |    q回地址    |

                       ------------------

                       |调用函数q行状态|

                       ------------------

可见Q参数是q箋存储在栈里面的,那么也就是说Q我们只要得到可变参数的前一个参数的地址Q就可以通过指针讉K到那些可变参数。但是怎么样得到可变参数的前一个参数的地址呢?不知道你注意到没有,参数可变函数在可变参C前必有一个参数是固定的,q用标识符Q而且通常被声明ؓchar*cdQprintf函数也不例外。这L话,我们可以通过q个参数对应的标识符来得到地址Q从而访问其他参数变得可能。我们可以写一个测试程序来试一下:

#include <stdio.h>



void va_test(char* fmt,...);//参数可变的函数声?br>


void main()

{

    int a=1,c=55;

       char b='b';

    va_test("",a,b,c);//用四个参数做试

}



void va_test(char* fmt,...) //参数可变的函数定义,注意W一个参Cؓchar* fmt

{

   char *p=NULL;



      p=(char *)&fmt;//注意不是指向fmtQ而是指向&fmtQƈ且强制{化ؓchar *,以便一个一个字节访?br>
      for(int i = 0;i<16;i++)//16是通过计算的|参数个数*4个字节)Q只是ؓ了测试,暂且就一?br>
      {

                printf("%.4d ",*p);//输出p指针指向地址的?br>
        p++;

      }

}



~译q行的结果ؓ

0056 0000 0066 0000 | 0001 0000 0000 0000 | 0098 0000 0000 0000 | 0055 0000 0000 0000



p行结果可见,通过q样方式可以逐一获得可变参数的倹{?br>
至于Z么通常被声明ؓchar*cdQ我们慢慢看来?br>
2Q怎样定参数cd和数?br>
通过上述的方式,我们首先解决了取得可变参数值的问题Q但是对于一个参敎ͼ值很重要Q其cd同样举轻重Q而对于一个函数来讲参CC非常重要Q否则就会生了一pd的麻烦来。通过讉K存储参数的栈I间Q我们ƈ不能得到关于cd的Q何信息和参数个数的Q何信息。我想你应该惛_了——用char *参数。Printf函数是q样实现的,它把后面的可变参数类型都攑ֈ了char *指向的字W数l里Qƈ通过%来标识以便与其它的字W相区别Q从而确定了参数cd也确定了参数个数。其实,用何U方式来到达q样的效果取决于函数的实现。比如说Q定义一个函敎ͼ预知它的可变参数cd都是intQ那么固定参数完全可以用intcd来替换char*cdQ因为只要得到参C数就可以了?br>
3Q言归正?br>
   我想Cq里Q大概的轮廓已经呈现出来了。本来想此作Ş的(我的惰性ӞQ但是一惛_如果不具实用性便可能是一堆废物,枉费我打了这么些字,军_q是l箋下去?br>
   我是比较抵制用那些不明所以的宏定义的Q所以在上面的阐q里一炚w没有涉及定义?lt;stdarg.h>的va(variable-argument)宏。事实上Q当时让我生极大疑惑和好奇的正是这几个宏定义。但是现在我们不得不要去和这些宏定义打打交道Q毕竟我们在讨生计的时候还得用上他们,q也是我C?#8220;a归正?#8221;的理由?br>
   好了Q我们来看一下那些宏定义?br>
   打开<stdarg.h>文gQ找一下va_*的宏定义Q发C单单只有一l,但是在各l定义前都会有宏~译。宏~译指示的是不同gq_和编译器下用怎样的va宏定义。比较一下,不同之处主要在偏U量的计上。我们还是拿个典型又熟悉的——X86的相兛_定义Q?br>
1)typedef char * va_list;

2)#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )



3)#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

4)#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

5)#define va_end(ap)      ( ap = (va_list)0 )



我们逐一看来Q?br>
W一个我想不必说了,cd定义|了。第二个是颇有些来头的,我们也不得不搞懂它,因ؓ后面的两个关键的宏定义都用到了。不知道你够不够l心Q有没有发现在上面的试E序中,W二个可变参数明明是charcdQ可是在输出l果中占?个byte。难道所有的参数都会?个byte的空_那如果是doublecd的参敎ͼ且不是会丢失数据Q如果你不嫌ȝ的话Q再d个测试吧Q在上面的测试程序中用一个doublecdQ长度ؓ8byteQ和一个long doublecdQ长度ؓ10byteQ做可变参数。发C么?doublecd占了8byte,而long double占了12byte。好像都?的整数倍哦。不得不引出另一个概念了“寚wQalignmentQ?#8221;,所谓对齐,对Intel80x86 机器来说是要求每个变量的地址都是sizeof(int)的倍数。原来我们搞错了Qcharcd的参数只占了1byteQ但是它后面的参数因为对齐的关系只能跌3byte存储Q而那3byte也就费掉了。那Z么要寚wQ因为在寚w方式下,CPU 的运行效率要快得多(举个例子吧,要说明的是下面的例子是我从网上摘录下来的Q不记得出处了?br>
CZQ如下图Q当一个long 型数Q如图中long1Q在内存中的位置正好与内存的字边界对齐时QCPU 存取q个数只需讉K一ơ内存,而当一个long 型数Q如图中的long2Q在内存中的位置跨越了字边界ӞCPU 存取q个数就需要多ơ访问内存,如i960cx 讉Kq样的数需d存三ơ(一个BYTE、一个SHORT、一个BYTEQ由CPU 的微代码执行Q对软g透明Q,所以对齐方式下CPU 的运行效率明昑ֿ多了?br>
1       8       16      24      32  

------- ------- ------- ---------

| long1 | long1 | long1 | long1 |

------- ------- ------- ---------

|        |        |         | long2 |

------- ------- ------- ---------

| long2 | long2 | long2 |        |

------- ------- ------- ---------

| ....)。好像扯得有点远来,但是有助于对_INTSIZEOF(n)的理解。位操作对于我来说是玄的东东。单个位q算q应付得来,而这样一个表辑ּ摆在面前晕了。怎么办?菜鸟自有菜的办法?待箋)


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=14721

---------------------------------------------------------------------------------------------------------------------

C语言中的可变参数函数    CSDN Blog推出文章指数概念Q文章指数是对Blog文章l合评分后推出的,l合评分分别是该文章的点击量,回复ơ数Q被|摘收录数量Q文章长度和文章cdQ满?00Q每月更Cơ?br>
W一?br>
C语言~程中有时会遇到一些参C数可变的函数,例如printf()函数,其函数原型ؓQ?br>
int printf( const char* format, ...);

它除了有一个参数format固定以外,后面跟的参数的个数和cd是可变的Q用三个?#8220;…”做参数占位符Q?实际调用时可以有以下的Ş式:

printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);  

一个简单的可变参数的C函数

     先看例子E序。该函数臛_有一个整数参?其后占位W?#8230;Q表C后面参数的个数不定。在q个例子里,所有的输入参数必须都是整数Q函数的功能只是打印所有参数的倹{函C码如下:

//CZ代码1Q可变参数函数的使用
#include "stdio.h"
#include "stdarg.h"
void simple_va_fun(int start, ...)
{
    va_list arg_ptr;
    int nArgValue =start;
    int nArgCout="0"; //可变参数的数?br>    va_start(arg_ptr,start); //以固定参数的地址v点确定变参的内存起始地址?br>    do
    {
        ++nArgCout;
        printf("the %d th arg: %d",nArgCout,nArgValue); //输出各参数的?br>        nArgValue = va_arg(arg_ptr,int); //得到下一个可变参数的?br>    } while(nArgValue != -1);              
    return;
}
int main(int argc, char* argv[])
{
    simple_va_fun(100,-1);
    simple_va_fun(100,200,-1);
    return 0;
}

下面解释一下这些代码。从q个函数的实现可以看?我们使用可变参数应该有以下步骤:

⑴由于在E序中将用到以下q些?
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
va在这里是variable-argument(可变参数)的意思?br>q些宏定义在stdarg.h?所以用到可变参数的E序应该包含q个头文件?br>
⑵函数里首先定义一个va_list型的变量,q里是arg_ptr,q个变量是存储参数地址的指?因ؓ得到参数的地址之后Q再l合参数的类型,才能得到参数的倹{?br>
⑶然后用va_start宏初始化⑵中定义的变量arg_ptr,q个宏的W二个参数是可变参数列表的前一个参?x后一个固定参数?br>
L后依ơ用va_arg宏arg_ptrq回可变参数的地址,得到q个地址之后Q结合参数的cdQ就可以得到参数的倹{?br>
⑸设定结束条Ӟq里的条件就是判断参数值是否ؓ-1。注意被调的函数在调用时是不知道可变参数的正数目的Q程序员必须自己在代码中指明l束条g。至于ؓ什么它不会知道参数的数目,在看完这几个宏的内部实现机制后,自然׃明白?br>
W二?br>
C语言之可变参数问?br>


C语言中有一U长度不定的参敎ͼ形如Q?…"Q它主要用在参数个数不确定的函数中,我们最Ҏ惛_的例子是printf函数?br>
  原型Q?br>
  int printf( const char *format [, argument]... );

  使用例:

  printf("Enjoy yourself everyday!\n");

  printf("The value is %d!\n", value);

  q种可变参数可以说是C语言一个比较难理解的部分,q里会由几个问题引发一些对它的分析?br>
  注意Q在C++中有函数重蝲QoverloadQ可以用来区别不同函数参数的调用Q但它还是不能表CZQ意数量的函数参数?br>
  问题Qprintf的实?br>
  请问Q如何自己实现printf函数Q如何处理其中的可变参数问题Q?{案与分析:

  在标准C语言中定义了一个头文g专门用来对付可变参数列表Q它包含了一l宏Q和一个va_list的typedef声明。一个典型实现如下:

  typedef char* va_list;

  #define va_start(list) list = (char*)&va_alist

  #define va_end(list)

  #define va_arg(list, mode)\

  ((mode*) (list += sizeof(mode)))[-1]

  自己实现printfQ?br>
  #include

  int printf(char* format, …)

  {

  va_list ap;

  va_start(ap, format);

  int n = vprintf(format, ap);

  va_end(ap);

  return n;

  }

  问题Q运行时才确定的参数

  有没有办法写一个函敎ͼq个函数参数的具体Ş式可以在q行时才定Q?br>
  {案与分析:

  目前没有"正规"的解军_法,不过独门偏方倒是有一个,因ؓ有一个函数已l给我们做出了这斚w的榜P那就是main()Q它的原型是:

  int main(int argc,char *argv[]);
函数的参数是argc和argv?br>
  深入想一下,"只能在运行时定参数形式"Q也是说你没办法从声明中看到所接受的参敎ͼ也即是参数根本就没有固定的Ş式。常用的办法是你可以通过定义一个void *cd的参敎ͼ用它来指向实际的参数区,然后在函CҎҎ需要Q意解释它们的含义。这是main函数中argv的含义,而argcQ则用来表明实际的参C敎ͼqؓ我们使用提供了进一步的方便Q当Ӟq个参数不是必需的?br>
  虽然参数没有固定形式Q但我们必然要在函数中解析参数的意义Q因此,理所当然会有一个要求,是调用者和被调者之间要对参数区内容的格式,大小Q有效性等所有方面达成一_否则南辕北辙各说各话惨了?br>
  问题Q可变长参数的传?br>
  有时候,需要编写一个函敎ͼ它的可变长参数直接传递给另外的函敎ͼ请问Q这个要求能否实玎ͼ

  {案与分析:

  目前Q你无办法直接做到q一点,但是我们可以q回前进Q首先,我们定义被调用函数的参数为va_listcdQ同时在调用函数中将可变长参数列表{换ؓva_listQ这样就可以q行变长参数的传递了。看如下所C:

  void subfunc (char *fmt, va_list argp)

  {

  ...

  arg = va_arg (fmt, argp); /* 从argp中逐一取出所要的参数 */

  ...

  }

  void mainfunc (char *fmt, ...)

  {

  va_list argp;

  va_start (argp, fmt); /* 可变长参数转换为va_list */

  subfunc (fmt, argp); /* va_list传递给子函?*/

  va_end (argp);

  ...

  }

  问题Q可变长参数中类型ؓ函数指针

  我想使用va_arg来提取出可变长参Ccd为函数指针的参数Q结果却L不正,Z么?

  {案与分析:

  q个与va_arg的实现有兟뀂一个简单的、演C版的va_arg实现如下Q?br>
  #define va_arg(argp, type) \

  (*(type *)(((argp) += sizeof(type)) - sizeof(type)))

  其中Qargp的类型是char *?br>
  如果你想用va_arg从可变参数列表中提取出函数指针类型的参数Q例?br>
  int (*)()Q则va_arg(argp, int (*)())被扩展ؓQ?br>
  (*(int (*)() *)(((argp) += sizeof (int (*)())) -sizeof (int (*)())))

  昄Q(int (*)() *Q是无意义的?br>
  解决q个问题的办法是函数指针用typedef定义成一个独立的数据cdQ例如:

  typedef int (*funcptr)()Q?br>
  q时候再调用va_arg(argp, funcptr)被扩展为:

  (* (funcptr *)(((argp) += sizeof (funcptr)) - sizeof (funcptr)))

  q样可以通过~译查了?br>
  问题Q可变长参数的获?br>
  有这样一个具有可变长参数的函敎ͼ其中有下列代码用来获取类型ؓfloat的实参:

  va_arg (argp, float);

  q样做可以吗Q?br>
  {案与分析:

  不可以。在可变长参CQ应用的?加宽"原则。也是floatcd被扩展成doubleQchar, short被扩展成int。因此,如果你要d变长参数列表中原来ؓfloatcd的参敎ͼ需要用va_arg(argp, double)。对char和shortcd的则用va_arg(argp, int)?br>
  问题Q定义可变长参数的一个限?br>
  Z么我的编译器不允许我定义如下的函敎ͼ也就是可变长参数Q但是没有Q何的固定参数Q?br>
  int f (...)

  {

  ...

  }

  {案与分析:

  不可以。这是ANSI C 所要求的,你至得定义一个固定参数?br>
  q个参数被传递给va_start()Q然后用va_arg()和va_end()来确定所有实际调用时可变长参数的cd和倹{?--------------------------------------------------------------------------------------------------------------------
如何判别可变参数函数的参数类型?

函数形式如下Q?br>void   fun(char*   str,...)
{
      ......
}

若传的参C数大?Q如何判别第2个以后传参的参数cdQ?Q?br>最好有源码说明Q?


没办法判断的


如楼上所?例如printf( "%d%c%s ",   ....)是通过格式串中?d,   %c,   %s来确定后面参数的cd,其实你也可以参考这U方法来判断不定参数的类?


无法判断。可变参数实C要通过三个宏实玎ͼva_start,   va_arg,   va_end?br>

六?扩展与思?br>
个数可变参数在声明时只需"..."卛_Q但是,我们在接受这些参数时不能"..."。va函数实现的关键就是如何得到参数列表中可选参敎ͼ包括参数的值和cd。以上的所有实现都是基于来自stdarg.h的va_xxx的宏定义?<思?gt;能不能不借助于va_xxxQ自己实现VA呢?Q我惛_的方法是汇编。在C中,我们当然qC的嵌入汇~来实现Q这应该是可以做得到的。至于能做到什么程度,E_性和效率怎么P主要要看你对内存和指针的控制了?br>
参考资?br>
1.IEEE和OpenGroup联合开发的Single Unix specification Ver3QBR>
2.Linux man手册Q?br>
3.x86汇编Q还有一些安全编码方面的资料?br>
---------------------------------------------------------------------------------------------------------------------
[转帖]对C/C++可变参数表的深层探烦

C/C++语言有一个不同于其它语言的特性,卛_支持可变参数Q典型的函数如printf、scanf{可以接受数量不定的参数。如Q?br>  printf ( "I love you" );
  printf ( "%d", a );
  printf ( "%d,%d", a, b );
  W一、二、三个printf分别接受1??个参敎ͼ让我们看看printf函数的原型:
  int printf ( const char *format, ... );
  从函数原型可以看出,光了接收一个固定的参数format以外Q后面的参数?…"表示。在C/C++语言中,"…"表示可以接受不定数量的参敎ͼ理论上来Ԍ可以??以上的n个参数?br>  本文对C/C++可变参数表的使用Ҏ及C/C++支持可变参数表的深层机理q行探烦?br>
  一. 可变参数表的用法
  1、相兛_
  标准C/C++包含头文件stdarg.hQ该头文件中定义了如下三个宏Q?br>void va_start ( va_list arg_ptr, prev_param ); /* ANSI version */
type va_arg ( va_list arg_ptr, type );
void va_end ( va_list arg_ptr );
  在这些宏中,va是variable argument(可变参数)的意思;arg_ptr是指向可变参数表的指针;prev_param则指可变参数表的前一个固定参敎ͼtype为可变参数的cd。va_list也是一个宏Q其定义为typedef char * va_listQ实质上是一 char型指针。char型指针的特点?+?-操作对其作用的结果是?和减1Q因为sizeof(char)?Q,与之不同的是int{其它类型指针的++?-操作对其作用的结果是增sizeof(type)或减sizeof(type)Q而且sizeof (type)大于1?br>  通过va_start宏我们可以取得可变参数表的首指针Q这个宏的定义ؓQ?br>#define va_start ( ap, v ) ( ap = (va_list)&v + _INTSIZEOF(v) )
  显而易见,其含义ؓ最后那个固定参数的地址加上可变参数对其的偏Ud赋值给apQ这样ap是可变参数表的首地址。其中的_INTSIZEOF宏定义ؓQ?br>#define _INTSIZEOF(n) ((sizeof ( n ) + sizeof ( int ) - 1 ) & ~( sizeof( int ) - 1 ) )
  va_arg宏的意思则指取出当前arg_ptr所指的可变参数q将ap指针指向下一可变参数Q其原型为:
#define va_arg(list, mode) ((mode *)(list =(char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) &(__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1]
  对这个宏的具体含义我们将在后面深入讨论?br>  而va_end宏被用来l束可变参数的获取,其定义ؓQ?br>#define va_end ( list )
  可以看出Qva_end ( list )实际上被定义为空Q没有Q何真实对应的代码Q用于代码对Uͼ与va_start对应Q另外,它还可能发挥代码?自注?作用。所谓代码的"自注?Q指的是代码能自己注释自己?br>  下面我们以具体的例子来说明以上三个宏的用方法?br>  2、一个简单的例子
  #include <stdarg.h>
  /* 函数名:max
  * 功能Q返回n个整C的最大?br>  * 参数QnumQ整数的个数 ...Qnum个输入的整数
  * q回|求得的最大整?br>  */
  int max ( int num, ... )
  {
   int m = -0x7FFFFFFF; /* 32pȝ中最的整数 */
   va_list ap;
   va_start ( ap, num );
   for ( int i= 0; i< num; i++ )
   {
    int t = va_arg (ap, int);
    if ( t > m )
    {
     m = t;
    }
   }
   va_end (ap);
   return m;
  }
  /* d数调用max */
  int main ( int argc, char* argv[] )
  {
   int n = max ( 5, 5, 6 ,3 ,8 ,5); /* ?个整C的最大?*/
   cout << n;
   return 0;
  }
  函数max中首先定义了可变参数表指针apQ而后通过va_start ( ap, num )取得了参数表首地址Q赋l了apQ,其后的for循环则用来遍历可变参数表。这U遍历方式与我们在数据结构教材中l常看到的遍历方式是cM的?br>  函数max看v来简z明了,但是实际上printf的实现却q比q复杂。max函数之所以看h单,是因为:
  (1) max函数可变参数表的长度是已知的Q通过num参数传入Q?br>  (2) max函数可变参数表中参数的类型是已知的,都ؓint型?br>  而printf函数则没有这么幸q。首先,printf函数可变参数的个C能轻易的得到Q而可变参数的cd也不是固定的Q需由格式字W串q行识别Q由%f?d?s{确定)Q因此则涉及到可变参数表的更复杂应用?br>  下面我们以实例来分析可变参数表的高应用?br>
  ? 高应用
  下面q个E序是我们ؓ某嵌入式pȝQ该pȝ中CPU的字长ؓ16位)~写的在屏幕上显C格式字W串的函数DrawTextQ它的用法类g int printf ( const char *format, ... )函数Q但其输出的目标为嵌入式pȝ的液晶显C屏q(LEDQ?br>  ///////////////////////////////////////////////////////////////////////////////
  // 函数名称: DrawText
  // 功能说明: 在显C屏上绘制文?br>  // 参数说明: xPos ---横坐标的位置 [0 .. 30]
  // yPos ---U坐标的位置 [0 .. 64]
  // ... 可以同数字一hC,需讄标志(%d?l?x?s)
  ///////////////////////////////////////////////////////////////////////////////
  extern void DrawText ( BYTE xPos, BYTE yPos, LPBYTE lpStr, ... )
  {
   BYTE lpData[100]; //~冲?br>   BYTE byIndex;
   BYTE byLen;
   DWORD dwTemp;
   WORD wTemp;
   int i;
   va_list lpParam;
   memset( lpData, 0, 100);
   byLen = strlen( lpStr );
   byIndex = 0;
   va_start ( lpParam, lpStr );
   for ( i = 0; i < byLen; i++ )
   {
    if( lpStr[i] != ’%’ ) //不是格式W开?br>    {
     lpData[byIndex++] = lpStr[i];
    }
    else
    {
     switch (lpStr[i+1])
     {
      //整型
      case ’d’:
      case ’D’:
       wTemp = va_arg ( lpParam, int );
       byIndex += IntToStr( lpData+byIndex, (DWORD)wTemp );
       i++;
       break;
      //长整?br>      case ’l’:
      case ’L’:
       dwTemp = va_arg ( lpParam, long );
       byIndex += IntToStr ( lpData+byIndex, (DWORD)dwTemp );
       i++;
       break;
      //16q制Q长整型Q?br>      case ’x’:
      case ’X’:
       dwTemp = va_arg ( lpParam, long );
       byIndex += HexToStr ( lpData+byIndex, (DWORD)dwTemp );
       i++;
       break;
      default:
       lpData[byIndex++] = lpStr[i];
       break;
     }
    }
   }
   va_end ( lpParam );
   lpData[byIndex] = ’#CONTENT#’;
   DisplayString ( xPos, yPos, lpData, TRUE); //在屏q上昄字符串lpData
  }
  在这个函CQ需通过对传入的格式字符Ԍ首地址为lpStrQ进行识别来L可变参数个数及各个可变参数的cdQ具体实C现在for循环中。譬如,在识别ؓ%d后,做的是va_arg ( lpParam, int )Q而获知ؓ%l?x后则q行的是va_arg ( lpParam, long )。格式字W串识别完成后,可变参数也就处理完了?br>  在项目的最初,我们一直苦于不能找C个好的办法来混合输出字符串和数字Q我们采用了分别昄数字和字W串的方法,q分别指定坐标,E序条理被破坏。而且Q在混合昄的时候,要给各类数据分别人工计算坐标Q我们感觉头g巌Ӏ以前的函数为:
  //昄字符?br>  showString ( BYTE xPos, BYTE yPos, LPBYTE lpStr )
  //昄数字
  showNum ( BYTE xPos, BYTE yPos, int num )
  //?6q制方式昄数字
  showHexNum ( BYTE xPos, BYTE yPos, int num )
  最l,我们用DrawText ( BYTE xPos, BYTE yPos, LPBYTE lpStr, ... )函数代替了原先所有的输出函数Q程序得C化。就q样Q兄弟们用得爽翻了?br>
  ? q行机制探烦
  通过W?节我们学会了可变参数表的使用ҎQ相信喜Ƣ抛栚w底的读者还不甘心,必然想知道如下问题:
  Q?Qؓ什么按照第2节的做法可以获得可变参数ƈ对其q行操作Q?br>  Q?QC/C++在底层究竟是依靠什么来对这一语法q行支持的,Z么其它语a׃能提供可变参数表呢?
  我们带着q些疑问来一步步q行摸烦?br>  3.1 调用机制反汇~?br>  反汇~是研究语法深层Ҏ的l极良策Q先来看?.2节例子中d数进行max ( 5, 5, 6 ,3 ,8 ,5)调用时的反汇~:
  1. 004010C8 push 5
  2. 004010CA push 8
  3. 004010CC push 3
  4. 004010CE push 6
  5. 004010D0 push 5
  6. 004010D2 push 5
  7. 004010D4 call @ILT+5(max) (0040100a)
  从上q反汇编代码中我们可以看出,C/C++函数调用的过E中Q?br>  W一步:参C叛_左入栈(W??行)Q?br>  W二步:调用call指oq行跌{Q第7行)?br>  q两步包含了深刻的含义,它说明C/C++默认的调用方式ؓp用者管理参数入栈的操作Q且入栈的顺序ؓ从右臛_Q这U调用方式称为_cdecl调用。x86pȝ的入栈方向ؓ从高地址C地址Q故W?至n个参数被攑֜了地址递增的堆栈内。在被调用函数内部,dq些堆栈的内容就可获得各个参数的|让我们反汇编到max函数的内部:
  int max ( int num, ...)
  {
  1. 00401020 push ebp
  2. 00401021 mov ebp,esp
  3. 00401023 sub esp,50h
  4. 00401026 push ebx
  5. 00401027 push esi
  6. 00401028 push edi
  7. 00401029 lea edi,[ebp-50h]
  8. 0040102C mov ecx,14h
  9. 00401031 mov eax,0CCCCCCCCh
  10. 00401036 rep stos dword ptr [edi]
  va_list ap;
  int m = -0x7FFFFFFF; /* 32pȝ中最的整数 */
  11. 00401038 mov dword ptr [ebp-8],80000001h
  va_start ( ap, num );
  12. 0040103F lea eax,[ebp+0Ch]
  13. 00401042 mov dword ptr [ebp-4],eax
  for ( int i= 0; i< num; i++ )
  14. 00401045 mov dword ptr [ebp-0Ch],0
  15. 0040104C jmp max+37h (00401057)
  16. 0040104E mov ecx,dword ptr [ebp-0Ch]
  17. 00401051 add ecx,1
  18. 00401054 mov dword ptr [ebp-0Ch],ecx
  19. 00401057 mov edx,dword ptr [ebp-0Ch]
  20. 0040105A cmp edx,dword ptr [ebp+8]
  21. 0040105D jge max+61h (00401081)
  {
   int t= va_arg (ap, int);
   22. 0040105F mov eax,dword ptr [ebp-4]
   23. 00401062 add eax,4
   24. 00401065 mov dword ptr [ebp-4],eax
   25. 00401068 mov ecx,dword ptr [ebp-4]
   26. 0040106B mov edx,dword ptr [ecx-4]
   27. 0040106E mov dword ptr [t],edx
   if ( t > m )
    28. 00401071 mov eax,dword ptr [t]
    29. 00401074 cmp eax,dword ptr [ebp-8]
    30. 00401077 jle max+5Fh (0040107f)
    m = t;
    31. 00401079 mov ecx,dword ptr [t]
    32. 0040107C mov dword ptr [ebp-8],ecx
   }
   33. 0040107F jmp max+2Eh (0040104e)
   va_end (ap);
   34. 00401081 mov dword ptr [ebp-4],0
   return m;
   35. 00401088 mov eax,dword ptr [ebp-8]
  }
  36. 0040108B pop edi
  37. 0040108C pop esi
  38. 0040108D pop ebx
  39. 0040108E mov esp,ebp
  40. 00401090 pop ebp
  41. 00401091 ret
  分析上述反汇~代码,对于一个真正的E序员而言Q将是一U很大的享受Q而对于初学者,也将使其受益良多。所以请一定要赖着头皮认真研究Q千万不要被吓倒!
  ??0q行执行函数内代码的准备工作Q保存现场。第2行对堆栈q行UdQ第3行则意味着max函数为其内部局部变量准备的堆栈I间?0h字节Q第11行表C把变量n的内存空间安排在了函数内部局部栈底减8的位|(占用4个字节)?br>  W?2?3行非常关键,对应着va_start ( ap, num )Q这两行第一个可变参数的地址赋值给了指针ap。另外,从第12行可以看出num的地址为ebp+0ChQ从W?3行可以看出ap被分配在函数内部局部栈底减4的位|上Q占?个字节)?br>  W?2?7行最为关键,对应着va_arg (ap, int)。其中,22~24行的作用为将ap指向下一可变参数Q可变参数的地址间隔?个字节,从add eax,4可以看出Q;25~27行则取当前可变参数的Dl变量t。这D反汇编很奇怪,它先Ud可变参数指针Q再在赋值指令里面回q头来取先前的参数DltQ从mov edx,dword ptr [ecx-4]语句可以看出Q。Visual C++同学玩得有意思,不知道碰见同L情况Visual Basic{其它同学怎么玩?
  W?6?1行恢复现场和堆栈地址Q执行函数返回操作?br>  痛苦的反汇编之旅差不多结束了Q看了这D反汇编我们ȝ弄明白了可变参数的存放位|以及它们被d的方式,觉全省LQ?br>  2、特D的调用U定
  除此之外Q我们需要了解C/C++函数调用对参数占用空间的一些特D约定,因ؓ在_cdecl调用协议中,有些变量cd是按照其它变量的寸入栈的?br>  例如Q字W型变量被自动扩展Z个字的空_因ؓ入栈操作针对的是一个字?br>  参数n实际占用的空间ؓ( ( sizeof(n) + sizeof(int) - 1 ) & ~( sizeof(int) - 1 ) )Q这是W?.1节_INTSIZEOF(v)宏的来历Q?br>  既然如此Q前面给出的va_arg ( list, mode )宏ؓ什么玩q么大的飞机很清楚了。这个问题就留个读者您来分?



http://wp1314.ycool.com/post.3001515.html


Brandon 2010-06-17 23:52 发表评论
]]>
c++中string的一些{?/title><link>http://www.shnenglu.com/maosher/archive/2009/05/31/86250.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Sun, 31 May 2009 04:38:00 GMT</pubDate><guid>http://www.shnenglu.com/maosher/archive/2009/05/31/86250.html</guid><wfw:comment>http://www.shnenglu.com/maosher/comments/86250.html</wfw:comment><comments>http://www.shnenglu.com/maosher/archive/2009/05/31/86250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/maosher/comments/commentRss/86250.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/maosher/services/trackbacks/86250.html</trackback:ping><description><![CDATA[<span style="font-family: K�K�K�; font-size: 12px; ">q是我上ơ从q里看到的把它给保存了下来,希望对你有用?#160;<br>1. c++中string到int的{?#160;<br>1) 在C标准库里面,使用atoiQ?#160;<br><br>#include <cstdlib> <br>#include <string> <br><br>std::string text = "152"; <br>int number = std::atoi( text.c_str() ); <br>if (errno == ERANGE) //可能是std::errno <br>{ <br>//number可能׃q大或过而不能完全存?#160;<br>} <br>else if (errno == ????) <br>//可能是EINVAL <br>{ <br>//不能转换成一个数?#160;<br>} <br><br>2) 在C++标准库里面,使用stringstreamQ?stringstream 可以用于各种数据cd之间的{? <br><br>#include <sstream> <br>#include <string> <br><br>std::string text = "152"; <br>int number; <br>std::stringstream ss; <br><br><br>ss < < text;//可以是其他数据类?#160;<br>ss >> number; //string -> int <br>if (! ss.good()) <br>{ <br>//错误发生 <br>} <br><br><br>ss < < number;// int->string <br>string str = ss.str(); <br>if (! ss.good()) <br>{ <br>//错误发生 <br>} <br><br>3) 在Boost库里面,使用lexical_castQ?#160;<br><br>#include <boost/lexical_cast.hpp> <br>#include <string> <br><br>try <br>{ <br>std::string text = "152"; <br>int number = boost::lexical_cast < int >( text ); <br>} <br>catch( const boost::bad_lexical_cast & ) <br>{ <br>//转换p| <br>}                      <br><br>2.string ?CString <br>CString.format(”%s”, string.c_str()); <br>用c_str()实比data()要好Q?#160;<br><br><br>3.char ?CString <br>CString.format(”%s”, char*); <br><br>4.char ?string <br>string s(char *); <br>只能初始化,在不是初始化的地Ҏ好还是用assign(). <br><br><br>5.string ?char * <br>char *p = string.c_str(); <br><br>6.CString ?string <br>string s(CString.GetBuffer()); <br>GetBuffer()后一定要ReleaseBuffer(),否则没有释攄冲区所占的I间. <br><br>7.字符串的内容转换为字W数l和C—string <br>(1)  data(),q回没有”\0“的字W串数组 <br>(2)  c_str()Q返回有”\0“的字W串数组 <br>(3)  copy() <br><br>8.CString与int、char*、char[100]之间的{?#160;<br><br>(1) CString互{int <br><br>字W{换ؓ整数Q可以用atoi、_atoi64或atol。而将数字转换为CString变量Q可以用CString的Format函数。如 <br>CString s; <br>int i = 64; <br>s.Format(”%d”, i) <br>Format函数的功能很强,值得你研I一下?#160;<br><br>void CStrDlg::OnButton1() <br>{ <br>  CString <br>  ss=”1212.12″; <br>  int temp=atoi(ss); <br>  CString aa; <br>  aa.Format(”%d”,temp); <br>  AfxMessageBox(”var is ” + aa); <br>} <br><br>(2) CString互{char* <br><br>///char * TO cstring <br>CString strtest; <br>char * charpoint; <br>charpoint=”give string a value”; //? <br>strtest=charpoint; <br><br>///cstring TO char * <br>charpoint=strtest.GetBuffer(strtest.GetLength()); <br><br>(3) 标准C里没有string,char *==char []==string, 可以用CString.Format(”%s”,char *)q个Ҏ来将char *转成CString?#160;<br>    要把CString转成char *Q用操作W(LPCSTRQCString可以了?#160;<br>    CString转换 char[100] <br>  char a[100]; <br>  CString str(”aaaaaa”); <br>  strncpy(a,(LPCTSTR)str,sizeof(a)); </span> <img src ="http://www.shnenglu.com/maosher/aggbug/86250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/maosher/" target="_blank">Brandon</a> 2009-05-31 12:38 <a href="http://www.shnenglu.com/maosher/archive/2009/05/31/86250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>泛型法http://www.shnenglu.com/maosher/archive/2009/04/10/79467.htmlBrandonBrandonFri, 10 Apr 2009 04:27:00 GMThttp://www.shnenglu.com/maosher/archive/2009/04/10/79467.htmlhttp://www.shnenglu.com/maosher/comments/79467.htmlhttp://www.shnenglu.com/maosher/archive/2009/04/10/79467.html#Feedback0http://www.shnenglu.com/maosher/comments/commentRss/79467.htmlhttp://www.shnenglu.com/maosher/services/trackbacks/79467.html

拯Q?br>

copyQ)
reverse_copy()
rotate_copy()
remove_copy()  拯不等于某值的元素到另一个序列?br>remove_copy_if() 拯W合条g的到另一个序列?/p>

填充和生成:
fill()
fill_n() 填充序列中的n个元素?br>generateQ)为序列中的每个元素调用genQ)函数?/p>

排列Q?br>next_permuttion() 后一个排列?br>prev_permutation()

partition() 划分Q将满条g的元素移动到序列的前面?br>stable_partition()

查找和替换:
findQ)
binary_search() 在一个已l有序的序列上查找?br>find_if()
search() 查第二个序列是否在第一个序列中出现Q且序相同?/p>

删除Q注意必调用eraseQ)来真正删?br>removeQ)
uniqueQ)删除盔R重复元素Q最好现排序?/p>

合ƈ序列Q?br>mergeQ)

数值算法:
accumulateQ) 对序列的每个元素q行q算后求和?br>transformQ) 也可以对每个元素q行q算?br>计数Q?br>sizeQ)M数?br>countQ){于某值的元素个数?/p>

adjacent_difference 序列中的后一个减前与他相ȝ前一个得到新的序列?/p>

adiacent_find

 accumlate Q?/span> iterator Ҏ志的序列中的元素之和Q加C个由 init 指定的初始g。重载的版本不再做加法,而是传进来的二元操作W被应用到元素上?/span> 

adjacent_different Q创Z个新序列Q该序列的每个新值都代表了当前元素与上一个元素的差。重载版本用指定的二元操作计相d素的差?/font> 
adjacent_find 
Q在 iterator Ҏ志的元素范围内,查找一对相ȝ重复元素Q如果找到返回一?/span> ForwardIterator Q指向这对元素的W一个元素。否则返?/span> last 。重载版本用输入的二元操作W代替相{的判断?/span> 
binary_search 
Q在有序序列中查?/span> value Q如果找到返?/span> true 。重载的版本使用指定的比较函数对象或者函数指针来判断相等?/span> 
copy 
Q复制序列?/font> 
copy_backward 
Q除了元素以相反的顺序被拯外,别的?/span> copy 相同?/span> 
count 
Q利用等于操作符Q把标志范围cȝ元素与输入的D行比较,q返回相{元素的个数?/font> 
count_if 
Q对于标志范围类的元素,应用输入的操作符Qƈq回l果?/span> true 的次数?/span> 
equal 
Q如果两个序列在范围内的元素都相{,?/span> equal q回 true 。重载版本用输入的操作W代替了默认的等于操作符?/span> 
equal_range 
Q返回一?/span> iterator Q第一?/span> iterator 表示?/span> lower_bound q回?/span> iterator Q第二个表示?/span> upper_bound q回?/span> iterator倹{?/span> 
fill 
Q将输入的值的拯赋给范围内的每个元素?/font> 
fill_n 
Q将输入的D值给 first ?/span> frist+n 范围内的元素?/span> 
find 
Q利用底层元素的{于操作W,对范围内的元素与输入的D行比较。当匚wӞl束搜烦Q返回该元素的一?/span> InputIterator ?/span> 
find_if 
Q用输入的函数替代了等于操作符执行?/span> find ?/span> 
find_end 
Q在范围内查?#8220;p入的另外一?/span> iterator Ҏ志的W二个序?#8221;的最后一ơ出现。重载版本中使用了用戯入的操作W替代等于操作?/span> 
find_first_of 
Q在范围内查?#8220;p入的另外一?/span> iterator Ҏ志的W二个序?#8221;中的L一个元素的W一ơ出现。重载版本中使用了用戯定义的操作符?/span> 
for_each 
Q依ơ对范围内的所有元素执行输入的函数?/font> 
generate 
Q通过对输入的函数 gen 的连l调用来填充指定的范围?/span> 
generate_n 
Q填?/span> n 个元素?/span> 
includes 
Q判?/span> [first1, last1) 的一个元素是否被包含在另外一个序列中。用底层元素的 <= 操作W,重蝲版本使用用户输入的函数?/span> 
inner_product 
Q对两个序列做内U?/span> ( 对应的元素相乘,再求?/span> ) Qƈ内U加C个输入的的初始g。重载版本用了用户定义的操作?/span> 
inner_merge 
Q合q两个排q序的连l序列,l果序列覆盖了两端范_重蝲版本使用输入的操作进行排序?/font> 
iter_swap 
Q交换两?/span> ForwardIterator 的倹{?/span> 
lexicographical_compare 
Q比较两个序列。重载版本用了用户自定义的比较操作?/font> 
lower_bound 
Q返回一?/span> iterator Q它指向在范围内的有序序列中可以插入指定D不破坏容器序的第一个位|。重载函C用了自定义的比较操作?/span> 
max 
Q返回两个元素中的较大的一个,重蝲版本使用了自定义的比较操作?/font> 
max_element 
Q返回一?/span> iterator Q指出序列中最大的元素。重载版本用自定义的比较操作?/span> 
min 
Q两个元素中的较者。重载版本用自定义的比较操作?/font> 
min_element 
Q类g max_element Q不q返回最的元素?/span> 
merge 
Q合q两个有序序列,q存攑ֈ另外一个序列中。重载版本用自定义的比较?/font> 
mismatch 
Qƈ行的比较两个序列Q指出第一个不匚w的位|,它返回一?/span> iterator Q标志第一个不匚w的元素位|。如果都匚wQ返回每个容器的 last 。重载版本用自定义的比较操作?/span> 
next_permutation 
Q取出当前范围内的排列,q将光新排序ؓ下一个排列。重载版本用自定义的比较操作?/font> 
nth_element 
Q将范围内的序列重新排序Q所有小于第 n 个元素的元素都出现在它前面,而大于它的都出现在后面,重蝲版本使用了自定义的比较操作?/span> 
partial_sort 
Q对整个序列做部分排序,被排序元素的个数正好可以被放到范围内。重载版本用自定义的比较操作?/font> 
partial_sort_copy 
Q与 partial_sort 相同Q除了将l过排序的序列复制到另外一个容器?/span> 
partial_sum 
Q创Z个新的元素序列,其中每个元素的g表了范围内该位置之前所有元素之和。重载版本用了自定义操作替代加法?/font> 
partition 
Q对范围内元素重新排序,使用输入的函敎ͼ把计结果ؓ true 的元素都攑֜l果?/span> false 的元素之前?/span> 
prev_permutation 
Q取围内的序列ƈ它重新排序Z一个序列。如果不存在上一个序列则q回 false 。重载版本用自定义的比较操作?/span> 
random_shuffle 
Q对范围内的元素随机调整ơ序。重载版本输入一个随机数产生操作?/font> 
remove 
Q删除在范围内的所有等于指定的元素Q注意,该函数ƈ不真正删除元素。内|数l不适合使用 remove ?/span> remove_if 函数?/span> 
remove_copy 
Q将所有不匚w的元素都复制C个指定容器,q回?/span> OutputIterator 指向被拷贝的末元素的下一个位|?/span> 
remove_if 
Q删除所有范围内输入操作l果?/span> true 的元素?/span> 
remove_copy_if 
Q将所有不匚w的元素拷贝到一个指定容器?/font> 
replace 
Q将范围内的所有等?/span> old_value 的元素都?/span> new_value 替代?/span> 
replace_copy 
Q与 replace cMQ不q将l果写入另外一个容器?/span> 
replace_if 
Q将范围内的所有操作结果ؓ true 的元素用新值替代?/span> 
replace_copy_if 
Q类g replace_if Q不q将l果写入另外一个容器?/span> 
reverse 
Q将范围内元素重新按反序排列?/font> 
reverse_copy 
Q类g reverse Q不q将l果写入另外一个容器?/span> 
rotate 
Q将范围内的元素Ud容器末尾Q由 middle 指向的元素成为容器第一个元素?/span> 
rotate_copy 
Q类g rotate Q不q将l果写入另外一个容器?/span> 
search 
Q给Z两个范围Q返回一?/span> iterator Q指向在范围内第一ơ出现子序列的位|。重载版本用自定义的比较操作?/span> 
search_n 
Q在范围内查?/span> value 出现 n ơ的子序列。重载版本用自定义的比较操作?/span> 
set_difference 
Q构造一个排q序的序列,其中的元素出现在W一个序列中Q但是不包含在第二个序列中。重载版本用自定义的比较操作?/font> 
set_intersection 
Q构造一个排q序的序列,其中的元素在两个序列中都存在。重载版本用自定义的比较操作?/font> 
set_symmetric_difference 
Q构造一个排q序的序列,其中的元素在W一个序列中出现Q但是不出现在第二个序列中。重载版本用自定义的比较操作?/font> 
set_union 
Q构造一个排q序的序列,它包含两个序列中的所有的不重复元素。重载版本用自定义的比较操作?/font> 
sort 
Q以升序重新排列范围内的元素Q重载版本用了自定义的比较操作?/font> 
stable_partition 
Q与 partition cMQ不q它不保证保留容器中的相寚w序?/span> 
stable_sort 
Q类g sort Q不q保留相{元素之间的序关系?/span> 
swap 
Q交换存储在两个对象中的倹{?/font> 
swap_range 
Q将在范围内的元素与另外一个序列的元素D行交换?/font> 
transform 
Q将输入的操作作用在范围内的每个元素上,q生一个新的序列。重载版本将操作作用在一对元素上Q另外一个元素来自输入的另外一个序列。结果输出到指定的容器?/font> 
unique 
Q清除序列中重复的元素,?/span> remove cMQ它也不能真正的删除元素。重载版本用了自定义的操作?/span> 
unique_copy 
Q类g unique Q不q它把结果输出到另外一个容器?/span> 
upper_bound 
Q返回一?/span> iterator Q它指向在范围内的有序序列中插入 value 而不破坏容器序的最后一个位|,该位|标志了一个大?/span> value 的倹{重载版本用了输入的比较操作?/span> 
堆算法: C++ 标准库提供的?/span> max-heap 。一q以下 4 个泛型堆法?/span> 
make_heap 
Q把范围内的元素生成一个堆。重载版本用自定义的比较操作?/font> 
pop_heap 
Qƈ不是真正的把最大元素从堆中弹出Q而是重新排序堆。它?/span> first ?/span> last-1 交换Q然后重新做成一个堆。可以用容器的 back 来访问被“弹出“的元素或者?/span> pop_back 来真正的删除。重载版本用自定义的比较操作?/span> 
push_heap 
Q假?/span> first ?/span> last-1 是一个有效的堆,要被加入堆的元素在位|?/span> last-1 Q重新生成堆。在指向该函数前Q必d把元素插入容器后。重载版本用指定的比较?/span> 
sort_heap 
Q对范围内的序列重新排序Q它假设该序列是个有序的堆。重载版本用自定义的比较操作?/font>



Brandon 2009-04-10 12:27 发表评论
]]>
详解typedef 的用?/title><link>http://www.shnenglu.com/maosher/archive/2009/04/10/79416.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Fri, 10 Apr 2009 01:20:00 GMT</pubDate><guid>http://www.shnenglu.com/maosher/archive/2009/04/10/79416.html</guid><wfw:comment>http://www.shnenglu.com/maosher/comments/79416.html</wfw:comment><comments>http://www.shnenglu.com/maosher/archive/2009/04/10/79416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/maosher/comments/commentRss/79416.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/maosher/services/trackbacks/79416.html</trackback:ping><description><![CDATA[     摘要: typedef 的用?#160;--摘自一位cnblog的一位大?#160;用途一Q?#160;定义一U类型的别名Q而不只是单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb;  // q多CW合我们的意图,它只声明了一个指向字W变量的指针Q?#160;// 和一个字W变量; 以下则可行: t...  <a href='http://www.shnenglu.com/maosher/archive/2009/04/10/79416.html'>阅读全文</a><img src ="http://www.shnenglu.com/maosher/aggbug/79416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/maosher/" target="_blank">Brandon</a> 2009-04-10 09:20 <a href="http://www.shnenglu.com/maosher/archive/2009/04/10/79416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cd转换http://www.shnenglu.com/maosher/archive/2009/04/03/78794.htmlBrandonBrandonFri, 03 Apr 2009 03:10:00 GMThttp://www.shnenglu.com/maosher/archive/2009/04/03/78794.htmlhttp://www.shnenglu.com/maosher/comments/78794.htmlhttp://www.shnenglu.com/maosher/archive/2009/04/03/78794.html#Feedback0http://www.shnenglu.com/maosher/comments/commentRss/78794.htmlhttp://www.shnenglu.com/maosher/services/trackbacks/78794.html昑ּcd转换又被UC?强制cd转换?#160;
C     风格Q?(type-id) 
C++风格Q?static_cast、dynamic_cast、reinterpret_cast、和const_cast 
C风格的强制类型{换是最好不要用的,最好是使用标准的C++风格的{换符?#160;


static_cast 
用法Q?/strong>static_cast < type-id > ( expression ) 
说明Q?/strong>该运符把expression转换为type-idcdQ但没有q行时类型检查来保证转换的安全性?#160;
主要用法Q?/strong> 
用于cdơ结构中基类和子cM间指针或引用的{换。进行上行{换(把子cȝ指针或引用{换成基类表示Q是安全的;q行下行转换Q把基类指针或引用{换成子类指针或引用)Ӟ׃没有动态类型检查,所以是不安全的?#160;
用于基本数据cd之间的{换,如把int转换成charQ把int转换成enum。这U{换的安全性也要开发h员来保证?#160;
把void指针转换成目标类型的指针(不安?!) 
把Q何类型的表达式{换成voidcd?#160;
注意Qstatic_cast不能转换掉expression的const、volitale、或者__unaligned属性?#160;

dynamic_cast 
用法Q?/strong>dynamic_cast < type-id > ( expression ) 
说明Q?/strong>该运符把expression转换成type-idcd的对象。Type-id必须是类的指针、类的引用或者void *Q如果type-id是类指针cdQ那么expression也必L一个指针,如果type-id是一个引用,那么expression也必L一个引用?#160;
dynamic_cast主要用于cdơ间的上行{换和下行转换Q还可以用于cM间的交叉转换?#160;
在类层次间进行上行{换时Qdynamic_cast和static_cast的效果是一LQ?#160;
在进行下行{换时Qdynamic_casthcd查的功能Q比static_cast更安全?#160;

reinterpret_cast 
用法Q?/strong>reinterpret_cast<type-id> (expression) 
说明Q?/strong>type-id必须是一个指针、引用、算术类型、函数指针或者成员指针?#160;
它可以把一个指针{换成一个整敎ͼ也可以把一个整数{换成一个指针(先把一个指针{换成一个整敎ͼ 
在把该整数{换成原类型的指针Q还可以得到原先的指针|?#160;
该运符的用法比较多?#160;

const_cast 
用法Q?/strong>const_cast<type_id> (expression) 
说明Q?/strong>该运符用来修改cd的const或volatile属性。除了const 或volatile修饰之外Q?type_id和expression的类型是一L?#160;
帔R指针被{化成非常量指针,q且仍然指向原来的对象; 
帔R引用被{换成非常量引用,q且仍然指向原来的对象;帔R对象被{换成非常量对象?br>

Brandon 2009-04-03 11:10 发表评论
]]>
string c?/title><link>http://www.shnenglu.com/maosher/archive/2009/02/08/73200.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Sun, 08 Feb 2009 02:42:00 GMT</pubDate><guid>http://www.shnenglu.com/maosher/archive/2009/02/08/73200.html</guid><wfw:comment>http://www.shnenglu.com/maosher/comments/73200.html</wfw:comment><comments>http://www.shnenglu.com/maosher/archive/2009/02/08/73200.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/maosher/comments/commentRss/73200.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/maosher/services/trackbacks/73200.html</trackback:ping><description><![CDATA[ <div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: rgb(204, 204, 204); width: 98%; word-break: break-all; padding-top: 4px; background-color: rgb(238, 238, 238); "><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">class String <br><img id="Codehighlighter1_14_240_Open_Image" onclick="this.style.display='none'; Codehighlighter1_14_240_Open_Text.style.display='none'; Codehighlighter1_14_240_Closed_Image.style.display='inline'; Codehighlighter1_14_240_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_14_240_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_14_240_Closed_Text.style.display='none'; Codehighlighter1_14_240_Open_Image.style.display='inline'; Codehighlighter1_14_240_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.shnenglu.com/Images/dot.gif">{ <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">public: <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    String(const char *str = NULL); // 普通构造函?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    String(const String &other); // 拯构造函?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    ~ String(void); // 析构函数 <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    String & operate =(const String &other); // 赋值函?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">private: <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    char *m_data; // 用于保存字符?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">// String 的析构函?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">String::~String(void) <br><img id="Codehighlighter1_285_350_Open_Image" onclick="this.style.display='none'; Codehighlighter1_285_350_Open_Text.style.display='none'; Codehighlighter1_285_350_Closed_Image.style.display='inline'; Codehighlighter1_285_350_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_285_350_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_285_350_Closed_Text.style.display='none'; Codehighlighter1_285_350_Open_Image.style.display='inline'; Codehighlighter1_285_350_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.shnenglu.com/Images/dot.gif">{ <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    delete [] m_data;// ׃m_data 是内部数据类?也可以写成delete m_data; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">} <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">// String 的普通构造函?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">String::String(const char *str) <br><img id="Codehighlighter1_406_660_Open_Image" onclick="this.style.display='none'; Codehighlighter1_406_660_Open_Text.style.display='none'; Codehighlighter1_406_660_Closed_Image.style.display='inline'; Codehighlighter1_406_660_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_406_660_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_406_660_Closed_Text.style.display='none'; Codehighlighter1_406_660_Open_Image.style.display='inline'; Codehighlighter1_406_660_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.shnenglu.com/Images/dot.gif">{ <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    if(str==NULL) <br><img id="Codehighlighter1_432_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_432_513_Open_Text.style.display='none'; Codehighlighter1_432_513_Closed_Image.style.display='inline'; Codehighlighter1_432_513_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_432_513_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_432_513_Closed_Text.style.display='none'; Codehighlighter1_432_513_Open_Image.style.display='inline'; Codehighlighter1_432_513_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">    <img src="http://www.shnenglu.com/Images/dot.gif">{ <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">        m_data = new char[1]; // 若能加NULL 判断则更?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">        *m_data = '\0'; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">    } <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    else <br><img id="Codehighlighter1_530_657_Open_Image" onclick="this.style.display='none'; Codehighlighter1_530_657_Open_Text.style.display='none'; Codehighlighter1_530_657_Closed_Image.style.display='inline'; Codehighlighter1_530_657_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_530_657_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_530_657_Closed_Text.style.display='none'; Codehighlighter1_530_657_Open_Image.style.display='inline'; Codehighlighter1_530_657_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">    <img src="http://www.shnenglu.com/Images/dot.gif">{ <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">        int length = strlen(str); <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">        m_data = new char[length+1]; // 若能加NULL 判断则更?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">        strcpy(m_data, str); <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">    } <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">} <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">// 拯构造函?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">String::String(const String &other) <br><img id="Codehighlighter1_712_841_Open_Image" onclick="this.style.display='none'; Codehighlighter1_712_841_Open_Text.style.display='none'; Codehighlighter1_712_841_Closed_Image.style.display='inline'; Codehighlighter1_712_841_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_712_841_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_712_841_Closed_Text.style.display='none'; Codehighlighter1_712_841_Open_Image.style.display='inline'; Codehighlighter1_712_841_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.shnenglu.com/Images/dot.gif">{ <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    int length = strlen(other.m_data); <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    m_data = new char[length+1]; // 若能加NULL 判断则更?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    strcpy(m_data, other.m_data); <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">} <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">// 赋值函?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top">String & String::operate =(const String &other) <br><img id="Codehighlighter1_904_1208_Open_Image" onclick="this.style.display='none'; Codehighlighter1_904_1208_Open_Text.style.display='none'; Codehighlighter1_904_1208_Closed_Image.style.display='inline'; Codehighlighter1_904_1208_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_904_1208_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_904_1208_Closed_Text.style.display='none'; Codehighlighter1_904_1208_Open_Image.style.display='inline'; Codehighlighter1_904_1208_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.shnenglu.com/Images/dot.gif">{ <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    // (1) 查自赋?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    if(this == &other) <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">        return *this; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    // (2) 释放原有的内存资?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    delete [] m_data; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    // (3)分配新的内存资源,q复制内?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    int length = strlen(other.m_data); <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    m_data = new char[length+1]; // 若能加NULL 判断则更?#160;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    strcpy(m_data, other.m_data); <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    // (4)q回本对象的引用 <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align="top">    return *this; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align="top"></div><img src ="http://www.shnenglu.com/maosher/aggbug/73200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/maosher/" target="_blank">Brandon</a> 2009-02-08 10:42 <a href="http://www.shnenglu.com/maosher/archive/2009/02/08/73200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>|摘Q一Q?/title><link>http://www.shnenglu.com/maosher/archive/2009/02/08/73193.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Sat, 07 Feb 2009 17:00:00 GMT</pubDate><guid>http://www.shnenglu.com/maosher/archive/2009/02/08/73193.html</guid><wfw:comment>http://www.shnenglu.com/maosher/comments/73193.html</wfw:comment><comments>http://www.shnenglu.com/maosher/archive/2009/02/08/73193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/maosher/comments/commentRss/73193.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/maosher/services/trackbacks/73193.html</trackback:ping><description><![CDATA[ 保持l一的接口,而具体行Z照对象而定Q不同的对象有不同的行ؓQ这个就是对多态的单解??br><br><br>具体在C++语言中,多态通过指针和引用来表现?br>x口用父cȝ指针或引用来表明抽象的统一的接口,而行为根据父cL针或引用所指向具体子类对象Q不同的对象表现Z同的行ؓQ此乃C++实现多态的风格Q具体来说我们在~程的时候需要用指向父cȝ指针或者引用,然后在子cM改写父类中的虚函敎ͼ最后再把子cd象赋值到父类指针或引用上?br> <br>C++的虚函数实际上采用散列表的数据结构实?.<img src ="http://www.shnenglu.com/maosher/aggbug/73193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/maosher/" target="_blank">Brandon</a> 2009-02-08 01:00 <a href="http://www.shnenglu.com/maosher/archive/2009/02/08/73193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.qinghaichu.cn" target="_blank">ɫʹþۺ</a>| <a href="http://www.garden-tools.com.cn" target="_blank">þþþþþƵ</a>| <a href="http://www.828wlp.cn" target="_blank"> þۺϾɫۺϾ99</a>| <a href="http://www.hbhshj.cn" target="_blank">91þþƷƵ</a>| <a href="http://www.pydjango.cn" target="_blank">һձ˾þۺӰ</a>| <a href="http://www.szlove.net.cn" target="_blank">þþƷAV㽶</a>| <a href="http://www.0108400.cn" target="_blank">ݺݸɺݺݾþ</a>| <a href="http://www.sfttc.cn" target="_blank">þþþƷSmվ</a>| <a href="http://www.itewei.cn" target="_blank">99þùۺϾƷ</a>| <a href="http://www.xbvz.cn" target="_blank">þ޾ƷAVӣ</a>| <a href="http://www.itkuo.cn" target="_blank">Ʒþþþþþö</a>| <a href="http://www.8x8z.cn" target="_blank">þþ뾫Ʒպ˳</a>| <a href="http://www.buchaqian.org.cn" target="_blank">޹Ʒþþϼ2 </a>| <a href="http://www.softplat.cn" target="_blank">ճˮþ޾Ʒtv</a>| <a href="http://www.ntysjx.cn" target="_blank">ٸ88þĻ</a>| <a href="http://www.frsmb.cn" target="_blank">þۺϺݺۺϾþ97ɫ</a>| <a href="http://www.liuy88.cn" target="_blank">9þ9þþƷ</a>| <a href="http://www.honglinzhiyi.cn" target="_blank">þþAVҰ</a>| <a href="http://www.youk6.cn" target="_blank">þþƷAV</a>| <a href="http://www.klzp.net.cn" target="_blank">Ʒþþþþ12 </a>| <a href="http://www.linuxls.cn" target="_blank">þùۺϾƷ</a>| <a href="http://www.etcaisn.cn" target="_blank">ƷۺϾþþþþ88С˵</a>| <a href="http://www.wyhwan.cn" target="_blank">jizzjizzƷþ</a>| <a href="http://www.chunhuanhcl.cn" target="_blank">Ʒպþ</a>| <a href="http://www.9ii8.cn" target="_blank">þþƷŮAV</a>| <a href="http://www.ldzx.sh.cn" target="_blank">91Ʒ91þþþþ</a>| <a href="http://www.hx0451.cn" target="_blank">Ůþþ</a>| <a href="http://www.sevengreen.cn" target="_blank">97þۺɫۺɫhd</a>| <a href="http://www.xxxls.cn" target="_blank">þҹɫƷ</a>| <a href="http://www.ewoman.com.cn" target="_blank">&#228;v뾫Ʒþþ </a>| <a href="http://www.hbxasn.cn" target="_blank">ŷ777Ʒþþþ</a>| <a href="http://www.by1506.cn" target="_blank">þ99Ʒþþþþþò</a>| <a href="http://www.masradio.com.cn" target="_blank">޾ƷۺϾþ</a>| <a href="http://www.9258bbs.cn" target="_blank">ӰɫۺϾþ</a>| <a href="http://www.qtvc.cn" target="_blank">ŷԴսþþþþ</a>| <a href="http://www.mjiniu.cn" target="_blank">޾ƷƷþ99</a>| <a href="http://www.anfubbs.cn" target="_blank">þĻƷ</a>| <a href="http://www.vlbx.cn" target="_blank">ɫ͵͵þһ</a>| <a href="http://www.woweikeji.cn" target="_blank">þþƷAV </a>| <a href="http://www.ldzv.cn" target="_blank">޾ƷþþþĻһڣ</a>| <a href="http://www.tzfxw.cn" target="_blank">þþƷaĻ þþƷŷƬ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>