﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-杰 &amp; C++-文章分类-C++</title><link>http://www.cppblog.com/jaysoon/category/10356.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2009 10:35:16 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2009 10:35:16 GMT</pubDate><ttl>60</ttl><item><title>关于this指针</title><link>http://www.cppblog.com/jaysoon/articles/81336.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Tue, 28 Apr 2009 10:09:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/articles/81336.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/81336.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/articles/81336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/81336.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/81336.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this指针的类型是&#8220;指向成员函数所属于的那个类的指针&#8221;，也就是说this的类型是&#8220;对象名*&#8221;。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个成员函数所收到的第一个参数就是this指针，但是它是隐含的，编译器在每个成员函数的声明中插入这个隐含参数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如<br>class Animal<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pirvate:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ID;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void printName() const<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;name&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这个例子中，printName()成员函数是无参的-至少表面上是这样的。那么，编译器是怎样识别name呢？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译器会这样做<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void printName(const Animal* this)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;this-&gt;name&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(有些C程序员十分讨厌C++的也正因如此，&#8220;我们不知道C++编译器会背着我们添加什么！&#8221;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另一方面，正因为this是指针类型，所以，this是一个地址值（虽然这对于普通指针是显然的，但一遇到this，很多人会忘记这一点）。因此，它具备普通指针的性质：this是对象的地址，而*this就是对象的值。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后，不要忘记，this指针仅仅在成员函数内部是合法的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this指针的概念，在其他OOP语言中同样存在，Smalltalk称之为Self，Eiffel使用Current,或许这两个词更准确一些。 
<img src ="http://www.cppblog.com/jaysoon/aggbug/81336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2009-04-28 18:09 <a href="http://www.cppblog.com/jaysoon/articles/81336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>