<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">引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(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'">其格式为:类型 &引用变量名 = 已定义过的变量名。</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&width=0&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> TestReference1 () </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> a = 1; </span></span></li><li class=""><span> <span class="datatypes">int</span><span>& b = a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> cout<<<span class="string">"a:address->"</span><span> <<&a<< endl; </span></span></li><li class="alt"><span> cout<<<span class="string">"b:address->"</span><span> <<&b<< endl; </span></span></li><li class=""><span> </span></li><li class="alt"><span> a = 2; </span></li><li class=""><span> b = 3; </span></li><li class="alt"><span> <span class="datatypes">int</span><span>& c = b;</span><span class="comment">// 引用一个引用变量,别名的别名</span><span> </span></span></li><li class=""><span> c = 4; </span></li><li class="alt"><span>} </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& b = a;
cout<<"a:address->" <<&a<< endl;
cout<<"b:address->" <<&b<< endl;
a = 2;
b = 3;
int& 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&width=0&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> TestReference2 () </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> d1 = 4; </span></span></li><li class=""><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> & d2 = d1; </span></span></li><li class="alt"><span> d1 = 5;<span class="comment">//d1改变,d2的值也会改变。</span><span> </span></span></li><li class=""><span> <span class="comment">//d2 = 6;//不能给常量(不能被修改的量)赋值。</span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> d3 = 1; </span></span></li><li class="alt"><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> & d4 = d3; </span></span></li><li class=""><span> <span class="comment">//int&d5 = d3;</span><span> </span></span></li><li class="alt"><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> & d6 = 5;</span><span class="comment">//常量具有常性,只有常引用可以引用常量</span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">double</span><span> d7 = 1.1; </span></span></li><li class=""><span> <span class="comment">//int& d8 = d7;//d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量</span><span> </span></span></li><li class="alt"><span> <span class="comment">//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。</span><span> </span></span></li><li class=""><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span>& d9 = d7; </span></span></li><li class="alt"><span>} </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 & d2 = d1;
d1 = 5;//d1改变,d2的值也会改变。
//d2 = 6;//不能给常量(不能被修改的量)赋值。
const int d3 = 1;
const int & d4 = d3;
//int&d5 = d3;
const int & d6 = 5;//常量具有常性,只有常引用可以引用常量
double d7 = 1.1;
//int& d8 = d7;//d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量
//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
const int& 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&width=0&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.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值 </span></span></li><li class=""><span><span class="keyword">void</span><span> Swap (</span><span class="datatypes">int</span><span> left, </span><span class="datatypes">int</span><span> right) </span><span class="comment">//值传递的方式无法实现交换,因为传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销 { //毁,并不会影响外部left和right的值。</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> temp = left; </span></span></li><li class=""><span> left = right ; </span></li><li class="alt"><span> right = temp ; </span></li><li class=""><span>} </span></li><li class="alt"><span> </span></li><li class=""><span>2.【引用传递】如果形参为引用类型,则形参是实参的别名。 </span></li><li class="alt"><span><span class="keyword">void</span><span> Swap (</span><span class="datatypes">int</span><span>& left, </span><span class="datatypes">int</span><span>& right)</span><span class="comment">//使用引用的话,不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值。</span><span> </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> temp = left; </span></span></li><li class=""><span> right = left ; </span></li><li class="alt"><span> left = temp ; </span></li><li class=""><span>} </span></li><li class="alt"><span> </span></li><li class=""><span>3.【指针传递】 </span></li><li class="alt"><span><span class="keyword">void</span><span> Swap (</span><span class="datatypes">int</span><span>* pLeft, </span><span class="datatypes">int</span><span>* pRight)</span><span class="comment">//传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容。</span><span> </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> temp = *pLeft; </span></span></li><li class=""><span> *pLeft = *pRight; </span></li><li class="alt"><span> *pRight = temp; </span></li><li class=""><span>} </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& left, int& right)//使用引用的话,不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值。
{
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)&在这里不是求地址运算,而是起标识作用。</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> <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> <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> <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> <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> <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> <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 </span></span><span style="font-size:14px; font-family:'Microsoft YaHei'">const... </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>
<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">引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(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'">其格式为:类型 &引用变量名 = 已定义过的变量名。</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&width=0&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> TestReference1 () </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> a = 1; </span></span></li><li class=""><span> <span class="datatypes">int</span><span>& b = a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> cout<<<span class="string">"a:address->"</span><span> <<&a<< endl; </span></span></li><li class="alt"><span> cout<<<span class="string">"b:address->"</span><span> <<&b<< endl; </span></span></li><li class=""><span> </span></li><li class="alt"><span> a = 2; </span></li><li class=""><span> b = 3; </span></li><li class="alt"><span> <span class="datatypes">int</span><span>& c = b;</span><span class="comment">// 引用一个引用变量,别名的别名</span><span> </span></span></li><li class=""><span> c = 4; </span></li><li class="alt"><span>} </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& b = a;
cout<<"a:address->" <<&a<< endl;
cout<<"b:address->" <<&b<< endl;
a = 2;
b = 3;
int& 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&width=0&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> TestReference2 () </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> d1 = 4; </span></span></li><li class=""><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> & d2 = d1; </span></span></li><li class="alt"><span> d1 = 5;<span class="comment">//d1改变,d2的值也会改变。</span><span> </span></span></li><li class=""><span> <span class="comment">//d2 = 6;//不能给常量(不能被修改的量)赋值。</span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> d3 = 1; </span></span></li><li class="alt"><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> & d4 = d3; </span></span></li><li class=""><span> <span class="comment">//int&d5 = d3;</span><span> </span></span></li><li class="alt"><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> & d6 = 5;</span><span class="comment">//常量具有常性,只有常引用可以引用常量</span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">double</span><span> d7 = 1.1; </span></span></li><li class=""><span> <span class="comment">//int& d8 = d7;//d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量</span><span> </span></span></li><li class="alt"><span> <span class="comment">//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。</span><span> </span></span></li><li class=""><span> <span class="keyword">const</span><span> </span><span class="datatypes">int</span><span>& d9 = d7; </span></span></li><li class="alt"><span>} </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 & d2 = d1;
d1 = 5;//d1改变,d2的值也会改变。
//d2 = 6;//不能给常量(不能被修改的量)赋值。
const int d3 = 1;
const int & d4 = d3;
//int&d5 = d3;
const int & d6 = 5;//常量具有常性,只有常引用可以引用常量
double d7 = 1.1;
//int& d8 = d7;//d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量
//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
const int& 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&width=0&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.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值 </span></span></li><li class=""><span><span class="keyword">void</span><span> Swap (</span><span class="datatypes">int</span><span> left, </span><span class="datatypes">int</span><span> right) </span><span class="comment">//值传递的方式无法实现交换,因为传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销 { //毁,并不会影响外部left和right的值。</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> temp = left; </span></span></li><li class=""><span> left = right ; </span></li><li class="alt"><span> right = temp ; </span></li><li class=""><span>} </span></li><li class="alt"><span> </span></li><li class=""><span>2.【引用传递】如果形参为引用类型,则形参是实参的别名。 </span></li><li class="alt"><span><span class="keyword">void</span><span> Swap (</span><span class="datatypes">int</span><span>& left, </span><span class="datatypes">int</span><span>& right)</span><span class="comment">//使用引用的话,不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值。</span><span> </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> temp = left; </span></span></li><li class=""><span> right = left ; </span></li><li class="alt"><span> left = temp ; </span></li><li class=""><span>} </span></li><li class="alt"><span> </span></li><li class=""><span>3.【指针传递】 </span></li><li class="alt"><span><span class="keyword">void</span><span> Swap (</span><span class="datatypes">int</span><span>* pLeft, </span><span class="datatypes">int</span><span>* pRight)</span><span class="comment">//传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容。</span><span> </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="datatypes">int</span><span> temp = *pLeft; </span></span></li><li class=""><span> *pLeft = *pRight; </span></li><li class="alt"><span> *pRight = temp; </span></li><li class=""><span>} </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& left, int& right)//使用引用的话,不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值。
{
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)&在这里不是求地址运算,而是起标识作用。</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> <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> <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> <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> <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> <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> <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 </span></span><span style="font-size:14px; font-family:'Microsoft YaHei'">const... </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>