C++引用详解

<div id="article_content" class="article_content" data-mod="popu_307" data-dsm="post">


<p><span style="font-family:Microsoft YaHei; font-size:18px"><strong>C++中的引用:</strong></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"><span style="font-size:14px">引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&amp;代替了*。引用(reference)是c++对<a href="http://lib.csdn.net/base/c" class="replace_word" title="C语言知识库" target="_blank" style="color:#df3434; font-weight:bold;">C语言</a>的重要扩充。引用就是某</span></span></span></p>
<p><span style="font-size:14px"><span style="font-family:'Microsoft YaHei'; white-space:pre">一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。</span><span style="font-family:'Microsoft YaHei'">其格式为:类型 &amp;引用变量名 = 已定义过的变量名。</span></span></p>
<p></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>引用的特点:</span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>①一个变量可取多个别名。</span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>②引用必须初始化。</span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。</span></span></p>
<p><br>
</p>
<p><br>
</p>
<p><span style="font-family:Microsoft YaHei; font-size:18px; color:#000099"><strong>①基础引用:</strong></span></p>
<p></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 0px; top: 0px; width: 0px; height: 0px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="0" height="0" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=0&amp;height=0" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="keyword">void</span><span>&nbsp;TestReference1&nbsp;()&nbsp;&nbsp;</span></span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;a&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&amp;&nbsp;b&nbsp;=&nbsp;a;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span class="string">"a:address-&gt;"</span><span>&nbsp;&lt;&lt;&amp;a&lt;&lt;&nbsp;endl;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span class="string">"b:address-&gt;"</span><span>&nbsp;&lt;&lt;&amp;b&lt;&lt;&nbsp;endl;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;2;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;3;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&amp;&nbsp;c&nbsp;=&nbsp;b;</span><span class="comment">//&nbsp;引用一个引用变量,别名的别名</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;4;&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="1742130" snippet_file_name="blog_20160703_1_6377050" name="code" class="cpp" style="display: none;">void TestReference1 ()
{
     int a = 1;
     int&amp; b = a;


     cout&lt;&lt;"a:address-&gt;" &lt;&lt;&amp;a&lt;&lt; endl;
     cout&lt;&lt;"b:address-&gt;" &lt;&lt;&amp;b&lt;&lt; endl;


     a = 2;
     b = 3;
     int&amp; c = b;// 引用一个引用变量,别名的别名
     c = 4;
}
</pre>
<p></p>
<p><br>
</p>
<br>
<span style="font-family:Microsoft YaHei; font-size:18px; color:#000099"><strong>②const引用:</strong></span>
<p></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 0px; top: 0px; width: 0px; height: 0px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="0" height="0" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=0&amp;height=0" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="keyword">void</span><span>&nbsp;TestReference2&nbsp;()&nbsp;&nbsp;</span></span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;d1&nbsp;=&nbsp;4;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">int</span><span>&nbsp;&amp;&nbsp;d2&nbsp;=&nbsp;d1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d1&nbsp;=&nbsp;5;<span class="comment">//d1改变,d2的值也会改变。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//d2&nbsp;=&nbsp;6;//不能给常量(不能被修改的量)赋值。</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">int</span><span>&nbsp;d3&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">int</span><span>&nbsp;&amp;&nbsp;d4&nbsp;=&nbsp;d3;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//int&amp;d5&nbsp;=&nbsp;d3;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">int</span><span>&nbsp;&amp;&nbsp;d6&nbsp;=&nbsp;5;</span><span class="comment">//常量具有常性,只有常引用可以引用常量</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">double</span><span>&nbsp;d7&nbsp;=&nbsp;1.1;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//int&amp;&nbsp;d8&nbsp;=&nbsp;d7;//d7是double类型,d8是int,d7赋值给&nbsp;d8时要生成一个临时变量</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">int</span><span>&amp;&nbsp;d9&nbsp;=&nbsp;d7;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="1742130" snippet_file_name="blog_20160703_2_5265018" name="code" class="cpp" style="display: none;">void TestReference2 ()
{
     int d1 = 4;
     const int &amp; d2 = d1;
     d1 = 5;//d1改变,d2的值也会改变。
     //d2 = 6;//不能给常量(不能被修改的量)赋值。


     const int d3 = 1;
     const int &amp; d4 = d3;
     //int&amp;d5 = d3;
     const int &amp; d6 = 5;//常量具有常性,只有常引用可以引用常量


     double d7 = 1.1;
     //int&amp; d8 = d7;//d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量
                   //也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
     const int&amp; d9 = d7;
}
</pre><br>
<br>
<p></p>
<p><span style="font-family:Microsoft YaHei; font-size:18px; color:#000099"><strong>③引用作参数:</strong></span></p>
<p></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 0px; top: 0px; width: 0px; height: 0px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="0" height="0" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&amp;width=0&amp;height=0" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span>1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">void</span><span>&nbsp;Swap&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;left,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;right)&nbsp;</span><span class="comment">//值传递的方式无法实现交换,因为传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//毁,并不会影响外部left和right的值。</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;temp&nbsp;=&nbsp;left;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;=&nbsp;right&nbsp;;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;=&nbsp;temp&nbsp;;&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>2.【引用传递】如果形参为引用类型,则形参是实参的别名。&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">void</span><span>&nbsp;Swap&nbsp;(</span><span class="datatypes">int</span><span>&amp;&nbsp;left,&nbsp;</span><span class="datatypes">int</span><span>&amp;&nbsp;right)</span><span class="comment">//使用引用的话,不做临时拷贝,&amp;的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;temp&nbsp;=&nbsp;left;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;=&nbsp;left&nbsp;;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;=&nbsp;temp&nbsp;;&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>3.【指针传递】&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">void</span><span>&nbsp;Swap&nbsp;(</span><span class="datatypes">int</span><span>*&nbsp;pLeft,&nbsp;</span><span class="datatypes">int</span><span>*&nbsp;pRight)</span><span class="comment">//传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;temp&nbsp;=&nbsp;*pLeft;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*pLeft&nbsp;=&nbsp;*pRight;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*pRight&nbsp;=&nbsp;temp;&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="1742130" snippet_file_name="blog_20160703_3_8471384" name="code" class="cpp" style="display: none;">1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值
void Swap (int left, int right) //值传递的方式无法实现交换,因为传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销 {                                //毁,并不会影响外部left和right的值。
     int temp = left;
     left = right ;
     right = temp ;
}


2.【引用传递】如果形参为引用类型,则形参是实参的别名。
void Swap (int&amp; left, int&amp; right)//使用引用的话,不做临时拷贝,&amp;的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值。
{
     int temp = left;
     right = left ;
     left = temp ;
}


3.【指针传递】
void Swap (int* pLeft, int* pRight)//传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容。
{
     int temp = *pLeft;
     *pLeft = *pRight;
     *pRight = temp;
}</pre>
<p></p>
<p><br>
</p>
<p><br>
</p>
<span style="font-size:18px"><strong><span style="font-family:Microsoft YaHei">引用虽方便,使用须谨慎:</span></strong></span>
<p><span style="font-family:'Microsoft YaHei'"><strong><span style="font-size:14px">(1)&amp;在这里不是求地址运算,而是起标识作用。</span></strong></span></p>
<p><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">(2)类型标识符是指目标变量的类型。<br>
</span></span></strong></p>
<p><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">(3)声明引用时,必须同时对其进行初始化。</span></span></strong></p>
<p><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。</span></span></strong></p>
<p><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">(5)对引用求地址,就是对目标变量求地址。即引用名是目标变量名的一个别名。引用在定义上是说引用不占据任何内存空间,但是编译器在一般将</span></span></strong></p>
<p><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">其实现为const指针,即指向位置不可变的指针,所以引用实际上与一般指针同样占用内存。</span></span></strong></p>
<p><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">(6)不能建立引用的数组。因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合,但是可以建立数组的引用。</span></span></strong></p>
<p><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">(7)引用常见的使用用途:作为函数的参数、函数的返回值。</span></span></strong></p>
<p><br>
</p>
<p><br>
</p>
<p><span style="color:rgb(255,0,0)"><strong><span style="font-size:18px"><span style="font-family:Microsoft YaHei">总结:</span></span></strong></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="color:rgb(255,0,0)"><span style="white-space:pre"><span style="font-size:14px"><span style="white-space:pre"></span>1. 不要返回一个临时变量的引用。</span></span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="color:rgb(255,0,0)"><span style="white-space:pre"><span style="white-space:pre"></span>2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。<br>
<span style="white-space:pre"><br>
</span>* 引用和指针的区别和联系(</span>笔试热点</span><span style="white-space:pre"><span style="color:rgb(255,0,0)">)</span></span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="font-size:14px"><span style="white-space:pre"></span>1. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。</span></span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="font-size:14px"><span style="white-space:pre"></span>2. 引用必须指向有效的变量,指针可以为空。</span></span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="font-size:14px"><span style="white-space:pre"></span>3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。<br>
</span></span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="font-size:14px">4. 指针和引用自增(++)自减(--)意义不一样。<br>
</span></span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="font-size:14px">5. 相对而言,引用比指针更安全。</span></span></span></span></p>
<p><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="color:rgb(255,0,0)"><strong><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><br>
</span></span></strong></span></span></span></p>
<p><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="color:rgb(255,0,0)"><span style="font-family:'Microsoft YaHei'"><strong><span style="font-size:18px">指针比引用更为灵活,但是其风险也很大。使用指针时一定要检查指针是否为空(NULL),且空间回收后指针最好置</span></strong></span></span></span></span></p>
<p><span style="white-space:pre"><span style="color:rgb(255,0,0)"><span style="color:rgb(255,0,0)"><span style="font-family:'Microsoft YaHei'"><strong><span style="font-size:18px">零,以免野指针的发生造成内存泄</span></strong></span></span></span></span><span style="font-family:'Microsoft YaHei'; color:rgb(255,0,0); white-space:pre"><span style="font-size:18px"><strong>漏等问题</strong>。</span></span></p>
<p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<p><span style="font-size:18px; color:rgb(0,0,153)"><strong><span style="font-family:Microsoft YaHei">Ⅰ.引用和指针的区别和联系:</span></strong></span></p>
<p><span style="font-size:18px"><span style="font-family:Microsoft YaHei"><span style="color:#ff0000"><strong><span style="white-space:pre">★</span>不同点</strong></span><span style="white-space:pre">:</span></span></span></p>
<p><span style="white-space:pre"><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px">1. 指针是一个实体,而引用仅是个别名;</span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>&nbsp;<span style="white-space:pre">2. 引用使用时无需解引用(*),指针需要解引用;</span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>&nbsp;<span style="white-space:pre">3. 引用只能在定义时被初始化一次,之后不可变;指针可变;</span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>&nbsp;<span style="white-space:pre">4. 引用没有 const,指针有 const;</span>const修饰的指针不可变;</span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>&nbsp;<span style="white-space:pre">5. 引用不能为空,指针可以为空;</span></span></span></p>
<p><span style="font-size:14px"><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"></span>&nbsp;<span style="white-space:pre">6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;</span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="white-space:pre"><span style="font-size:14px">7. 指针和引用的自增(++)运算意义不一样;</span></span></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>&nbsp;<span style="white-space:pre">8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。</span></span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:18px"><span style="color:#ff0000"><strong>★相同点</strong></span>:</span><span style="font-size:14px">两者都是地址的概念,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。</span></span></p>
<p><span style="font-family:Microsoft YaHei"><br>
</span></p>
<p><span style="font-family:Microsoft YaHei"><br>
</span></p>
<p><span style="font-family:Microsoft YaHei"><br>
</span></p>
<p><span style="font-family:Microsoft YaHei"><br>
</span></p>
<p><span style="font-size:18px; color:rgb(0,0,153)"><strong><span style="font-family:Microsoft YaHei">Ⅱ.const在C和C++中的含义(笔试热点):</span></strong></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="color:rgb(0,0,153); font-size:18px"><strong>⑴C中的const,功能比较单一,较容易理解</strong></span><span style="font-size:18px">:</span><br>
<span style="color:rgb(255,0,0); font-size:18px"><strong>作用:</strong></span><span style="font-size:14px">被修饰的内容不可更改。</span><br>
<span style="color:rgb(255,0,0); font-size:18px"><strong>使用场合:</strong></span><span style="font-size:14px">修饰变量,函数参数,返回值等。(c++中应用场合要丰富的多)</span><br>
<span style="color:rgb(255,0,0); font-size:18px"><strong>特点: </strong></span><span style="font-size:14px">是运行时const,因此不能取代#define用于成为数组长度等需要编译时常量的情况。同时因为是运行时const,可以只定义而不初始化,而在运行时初始化。如 const int iConst;。 另外,在c中,const变量默认是外部链接,因此在不同的编译单元中如果有同名const变量,会引发命名冲突,编译时报错。</span><br>
<span style="color:rgb(0,0,153); font-size:18px"><strong>⑵c++中的const:</strong></span><span style="color:rgb(255,0,0); font-size:18px"><strong><br>
</strong></span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="color:rgb(255,0,0); font-size:18px"><strong>a、非类成员const:</strong></span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px"><span style="white-space:pre"></span>①const变量默认是内部连接的,因此在不同的编译单元中可以有同名的const 变量定义。</span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px"><span style="white-space:pre"></span>②编译时常量,因此可以像#define一样使用,而且因为上面一点,可以在头文件中定义const变量,包含的不同的cpp文件(编译</span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px">单元)中使用而不引</span></span><span style="font-size:14px; font-family:'Microsoft YaHei'">起命名冲突。</span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>③编译器默认不为const变量分配内存,除非:1. 使用 extern 申明, 2:程序中有引用const 变量的地址。</span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px"><span style="white-space:pre"></span>④c++中临时对象/内置变量默认具有const属性。</span></span></p>
<p><span style="color:rgb(255,0,0); font-size:18px; font-family:'Microsoft YaHei'"><strong>b、类中的const:</strong></span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>①与c语言中的const一样,只是运行时常量,不能作为数组维数使用,即不能取代#define。在类中使用下面两种方式取代#define: 1:static&nbsp;</span></span><span style="font-size:14px; font-family:'Microsoft YaHei'">const...&nbsp;</span></p>
<p><span style="font-size:14px; font-family:'Microsoft YaHei'"><span style="white-space:pre"></span>2 : enum{....}//enum 不占存储空间。</span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>②类中的const 变量占用存储空间。</span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px"><span style="white-space:pre"></span>③类中的const成员变量需要在构造函数初始化列表中初始化。</span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px"><span style="white-space:pre"></span>④const 对象:在该对象生命周期内,必须保证没有任何成员变量被改变。const对象只能调用const成员函数。</span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px"><span style="white-space:pre"></span>⑤const成员函数: void fun() const ... 不仅能被const对象调用,也能被非const对象调用,因此,如果确认一个任何成员函数不改</span></span></p>
<p><span style="font-family:Microsoft YaHei"><span style="font-size:14px">变任何成员变量,</span></span><span style="font-size:14px; font-family:'Microsoft YaHei'">应该习惯性将该函数定义成const类型。</span></p>
<p><span style="font-family:'Microsoft YaHei'"><span style="font-size:14px"><span style="white-space:pre"></span>⑥如果一个对象被定义成const,那么该const对象“可能”会被放入到ROM当中,这在<a href="http://lib.csdn.net/base/embeddeddevelopment" class="replace_word" title="嵌入式开发知识库" target="_blank" style="color:#df3434; font-weight:bold;">嵌入式开发</a>当中有时非常重要</span><span style="font-size:14px">。</span></span><br>
</p>
<p><br>
</p>
<p><br>
</p>
   
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值