Files
hustoj/web/cppreference-zh/chmhelp/cpp-language-friend.html
2025-08-01 12:57:54 +08:00

423 lines
46 KiB
HTML

<!DOCTYPE html>
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>&#21451;&#20803;&#22768;&#26126;</title>
<link rel="stylesheet" href="ext.css" />
<link rel="stylesheet" href="site_modules.css" />
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_friend skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#21451;&#20803;&#22768;&#26126;</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-language.html">language</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<p>&#21451;&#20803;&#22768;&#26126;&#22312;<a href="cpp-language-class.html">&#31867;&#20307;</a>&#20869;&#20986;&#29616;&#65292;&#24182;&#21521;&#19968;&#20010;&#20989;&#25968;&#25110;&#21478;&#19968;&#20010;&#31867;&#25480;&#20104;&#23545;&#21253;&#21547;&#21451;&#20803;&#22768;&#26126;&#30340;&#31867;&#30340;&#31169;&#26377;&#21450;&#21463;&#20445;&#25252;&#25104;&#21592;&#30340;&#35775;&#38382;&#26435;&#12290;</p>
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">&#35821;&#27861;</span></h3>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span></span></span> <span class="t-spar">&#20989;&#25968;&#22768;&#26126;</span></td>
<td>(1)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span></span></span> <span class="t-spar">&#20989;&#25968;&#23450;&#20041;</span></td>
<td>(2)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span></span></span> <span class="t-spar">&#35814;&#36848;&#31867;&#35828;&#26126;&#31526;</span> <code><b>;</b></code></td>
<td>(3)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span></span></span> <span class="t-spar">&#31616;&#21333;&#31867;&#22411;&#35828;&#26126;&#31526;</span> <code><b>;</b></code>
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span></span></span> <span class="t-spar">typename-&#35828;&#26126;&#31526;</span> <code><b>;</b></code></p>
</td>
<td>(4)</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E6.8F.8F.E8.BF.B0">&#25551;&#36848;</span></h3>
<div class="t-li1"><span class="t-li">1)</span> &#25351;&#26126;&#19968;&#20010;&#25110;&#22810;&#20010;&#20989;&#25968;&#20026;&#27492;&#31867;&#30340;&#21451;&#20803;&#65306;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> Y <span class="br0">{</span>
<span class="kw4">int</span> data<span class="sy4">;</span> <span class="co1">// &#31169;&#26377;&#25104;&#21592;</span>
<span class="co1">// &#38750;&#25104;&#21592;&#20989;&#25968;&#30340;&#36816;&#31639;&#31526; operator&lt;&lt; &#23558;&#25317;&#26377;&#23545; Y &#30340;&#31169;&#26377;&#25104;&#21592;&#30340;&#35775;&#38382;&#26435;</span>
<span class="kw1">friend</span> <a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> out, <span class="kw4">const</span> Y<span class="sy3">&amp;</span> o<span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">friend</span> <span class="kw4">char</span><span class="sy2">*</span> X<span class="sy4">::</span><span class="me2">foo</span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#20854;&#20182;&#31867;&#30340;&#25104;&#21592;&#20063;&#21487;&#20197;&#26159;&#21451;&#20803;</span>
<span class="kw1">friend</span> X<span class="sy4">::</span><span class="me2">X</span><span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span>, X<span class="sy4">::</span>~X<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#26500;&#36896;&#20989;&#25968;&#19982;&#26512;&#26500;&#20989;&#25968;&#20063;&#21487;&#20197;&#26159;&#21451;&#20803;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#21451;&#20803;&#22768;&#26126;&#19981;&#22768;&#26126;&#25104;&#21592;&#20989;&#25968;</span>
<span class="co1">// &#27492; operator&lt;&lt; &#20316;&#20026;&#38750;&#25104;&#21592;&#20173;&#38656;&#23450;&#20041;</span>
<a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> out, <span class="kw4">const</span> Y<span class="sy3">&amp;</span> y<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">return</span> out <span class="sy1">&lt;&lt;</span> y.<span class="me1">data</span><span class="sy4">;</span> <span class="co1">// &#21487;&#35775;&#38382;&#31169;&#26377;&#25104;&#21592; Y::data</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">2)</span> &#65288;&#21482;&#20801;&#35768;&#22312;&#38750;<a href="cpp-language-class.html#.E5.B1.80.E9.83.A8.E7.B1.BB">&#23616;&#37096;</a>&#31867;&#30340;&#23450;&#20041;&#20013;&#20351;&#29992;&#65289;&#23450;&#20041;&#19968;&#20010;&#38750;&#25104;&#21592;&#20989;&#25968;&#65292;&#21516;&#26102;&#20196;&#20854;&#20026;&#27492;&#31867;&#30340;&#21451;&#20803;&#12290;&#36825;&#31181;&#38750;&#25104;&#21592;&#20989;&#25968;&#22987;&#32456;&#26159;<a href="cpp-language-inline.html">&#20869;&#32852;&#20989;&#25968;</a><span class="t-rev-inl t-since-cxx20"><span>&#65292;&#38500;&#38750;&#23427;&#38468;&#30528;&#21040;&#19968;&#20010;<a href="cpp-language-modules.html">&#20855;&#21517;&#27169;&#22359;</a></span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> X <span class="br0">{</span>
<span class="kw4">int</span> a<span class="sy4">;</span>
<span class="kw1">friend</span> <span class="kw4">void</span> friend_set<span class="br0">(</span>X<span class="sy3">&amp;</span> p, <span class="kw4">int</span> i<span class="br0">)</span> <span class="br0">{</span>
p.<span class="me1">a</span> <span class="sy1">=</span> i<span class="sy4">;</span> <span class="co1">// &#36825;&#26159;&#38750;&#25104;&#21592;&#20989;&#25968;</span>
<span class="br0">}</span>
<span class="kw1">public</span><span class="sy4">:</span>
<span class="kw4">void</span> member_set<span class="br0">(</span><span class="kw4">int</span> i<span class="br0">)</span> <span class="br0">{</span>
a <span class="sy1">=</span> i<span class="sy4">;</span> <span class="co1">// &#36825;&#26159;&#25104;&#21592;&#20989;&#25968;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">3)</span> &#25351;&#23450;&#20197; <span class="t-spar">&#35814;&#36848;&#31867;&#35828;&#26126;&#31526;</span>&#65288;&#35265;<a href="cpp-language-elaborated_type_specifier.html">&#35814;&#36848;&#31867;&#22411;&#35828;&#26126;&#31526;</a>&#65289;&#25351;&#21517;&#30340; class&#12289;struct &#25110; union &#20026;&#27492;&#31867;&#30340;&#21451;&#20803;&#12290;&#36825;&#24847;&#21619;&#30528;&#35813;&#21451;&#20803;&#30340;&#21508;&#25104;&#21592;&#22768;&#26126;&#21644;&#23450;&#20041;&#21487;&#20197;&#35775;&#38382;&#27492;&#31867;&#30340;&#31169;&#26377;&#19982;&#21463;&#20445;&#25252;&#25104;&#21592;&#65292;&#32780;&#19988;&#35813;&#21451;&#20803;&#20063;&#33021;&#20174;&#27492;&#31867;&#30340;&#31169;&#26377;&#25110;&#21463;&#20445;&#25252;&#25104;&#21592;&#36827;&#34892;&#32487;&#25215;&#12290; &#19981;&#38656;&#35201;&#25552;&#21069;&#22768;&#26126;&#29992;&#20110;&#27492; <code>friend</code> &#22768;&#26126;&#30340;&#31867;&#21517;&#12290;</div>
<div class="t-li1"><span class="t-li">4)</span> &#25351;&#23450;&#20197; <span class="t-spar">&#31616;&#21333;&#31867;&#22411;&#35828;&#26126;&#31526;</span> &#25110; <span class="t-spar">typename-&#35828;&#26126;&#31526;</span> &#25351;&#21517;&#30340;&#31867;&#22411;&#65292;&#22914;&#26524;&#35813;&#31867;&#22411;&#26159;&#65288;&#21487;&#26377; <a href="cpp-language-cv.html">cv &#38480;&#23450;</a>&#30340;&#65289;class&#12289;struct &#25110; union&#65292;&#37027;&#20040;&#35813;&#31867;&#22411;&#26159;&#27492;&#31867;&#30340;&#21451;&#20803;&#65307;&#21542;&#21017;&#24573;&#30053;&#35813; <code>friend</code> &#22768;&#26126;&#12290;&#27492;&#22768;&#26126;&#19981;&#21069;&#32622;&#22768;&#26126;&#26032;&#31867;&#22411;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> Y <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">class</span> A <span class="br0">{</span>
<span class="kw4">int</span> data<span class="sy4">;</span> <span class="co1">// &#31169;&#26377;&#25968;&#25454;&#25104;&#21592;</span>
<span class="kw1">class</span> B <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#31169;&#26377;&#23884;&#22871;&#31867;&#22411;</span>
<span class="kw2">enum</span> <span class="br0">{</span> a <span class="sy1">=</span> <span class="nu0">100</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#31169;&#26377;&#26522;&#20030;&#39033;</span>
<span class="kw1">friend</span> <span class="kw1">class</span> X<span class="sy4">;</span> <span class="co1">// &#21451;&#20803;&#31867;&#30340;&#21069;&#32622;&#22768;&#26126;&#65288;&#35814;&#36848;&#31867;&#22411;&#35828;&#26126;&#31526;&#65289;</span>
<span class="kw1">friend</span> Y<span class="sy4">;</span> <span class="co1">// &#21451;&#20803;&#31867;&#22768;&#26126;&#65288;&#31616;&#21333;&#31867;&#22411;&#35828;&#26126;&#31526;&#65289; (C++11 &#36215;)</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">class</span> X <span class="sy4">:</span> A<span class="sy4">::</span><span class="me2">B</span> <span class="co1">// OK&#65306;&#21451;&#20803;&#33021;&#35775;&#38382; A::B</span>
<span class="br0">{</span>
A<span class="sy4">::</span><span class="me2">B</span> mx<span class="sy4">;</span> <span class="co1">// OK&#65306;&#21451;&#20803;&#30340;&#25104;&#21592;&#33021;&#35775;&#38382; A::B</span>
<span class="kw1">class</span> Y <span class="br0">{</span>
A<span class="sy4">::</span><span class="me2">B</span> my<span class="sy4">;</span> <span class="co1">// OK&#65306;&#21451;&#20803;&#30340;&#23884;&#22871;&#25104;&#21592;&#33021;&#35775;&#38382; A::B</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> v<span class="br0">[</span>A<span class="sy4">::</span><span class="me2">a</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#21451;&#20803;&#30340;&#25104;&#21592;&#33021;&#35775;&#38382; A::a</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">&#27880;&#35299;</span></h3>
<p>&#21451;&#20803;&#20851;&#31995;&#19981;&#20256;&#36882;&#65288;&#20320;&#26379;&#21451;&#30340;&#26379;&#21451;&#19981;&#26159;&#20320;&#30340;&#26379;&#21451;&#65289;&#12290;</p>
<p>&#21451;&#20803;&#20851;&#31995;&#19981;&#32487;&#25215;&#65288;&#20320;&#26379;&#21451;&#30340;&#23401;&#23376;&#19981;&#26159;&#20320;&#30340;&#26379;&#21451;&#65289;&#12290;</p>
<p>&#21451;&#20803;&#20989;&#25968;&#22768;&#26126;&#20013;&#19981;&#20801;&#35768;&#20351;&#29992;&#23384;&#20648;&#31867;&#35828;&#26126;&#31526;&#12290;&#22312;&#21451;&#20803;&#22768;&#26126;&#20013;&#23450;&#20041;&#30340;&#20989;&#25968;&#20855;&#26377;&#22806;&#37096;&#38142;&#25509;&#65292;&#20808;&#21069;&#24050;&#23450;&#20041;&#30340;&#20989;&#25968;&#20445;&#25345;&#20854;&#23450;&#20041;&#26102;&#25152;&#20855;&#26377;&#30340;&#38142;&#25509;&#12290;</p>
<p><a href="cpp-language-access.html">&#35775;&#38382;&#35828;&#26126;&#31526;</a>&#23545;&#20110;&#21451;&#20803;&#22768;&#26126;&#30340;&#21547;&#20041;&#27809;&#26377;&#24433;&#21709;&#65288;&#23427;&#20204;&#21487;&#20197;&#22312; <code>private:</code> &#25110; <code>public:</code> &#21306;&#38388;&#20986;&#29616;&#65292;&#19988;&#27809;&#26377;&#21306;&#21035;&#65289;&#12290;</p>
<p>&#21451;&#20803;&#31867;&#22768;&#26126;&#19981;&#33021;&#23450;&#20041;&#26032;&#30340;&#31867;&#65288;<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">friend</span> <span class="kw1">class</span> X <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span></span></span> &#26159;&#38169;&#30340;&#65289;&#12290;</p>
<p>&#24403;&#23616;&#37096;&#31867;&#23558;&#19968;&#20010;&#26080;&#38480;&#23450;&#30340;&#20989;&#25968;&#25110;&#31867;&#22768;&#26126;&#20026;&#20854;&#21451;&#20803;&#26102;&#65292;&#21482;<a href="cpp-language-lookup.html">&#26597;&#25214;</a>&#22312;&#20854;&#26368;&#20869;&#23618;&#38750;&#31867;&#20316;&#29992;&#22495;&#20013;&#30340;&#20989;&#25968;&#19982;&#31867;&#65292;&#32780;&#38750;&#20840;&#23616;&#20989;&#25968;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> F <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">extern</span> <span class="kw4">int</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">class</span> Local <span class="br0">{</span> <span class="co1">// main() &#20989;&#25968;&#20013;&#30340;&#23616;&#37096;&#31867;</span>
<span class="kw1">friend</span> <span class="kw4">int</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65292;main() &#20013;&#27809;&#26377;&#22768;&#26126;&#35813;&#20989;&#25968;</span>
<span class="kw1">friend</span> <span class="kw4">int</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65292;main() &#20013;&#26377; g &#30340;&#22768;&#26126;</span>
<span class="kw1">friend</span> <span class="kw1">class</span> F<span class="sy4">;</span> <span class="co1">// &#20196;&#23616;&#37096; F&#65288;&#38543;&#21518;&#23450;&#20041;&#65289;&#20026;&#21451;&#20803;</span>
<span class="kw1">friend</span> <span class="kw1">class</span> <span class="sy4">::</span><span class="me2">F</span><span class="sy4">;</span> <span class="co1">// &#20196;&#20840;&#23616; F &#20026;&#21451;&#20803;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">class</span> F <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#23616;&#37096; F</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#39318;&#27425;&#22312;&#31867;&#25110;&#31867;&#27169;&#26495; X &#20013;&#30340;&#21451;&#20803;&#22768;&#26126;&#20013;&#34987;&#22768;&#26126;&#30340;&#21517;&#23383;&#20250;&#25104;&#20026; X &#30340;&#26368;&#20869;&#23618;&#22806;&#22260;&#21629;&#21517;&#31354;&#38388;&#30340;&#25104;&#21592;&#65292;&#20294;&#23427;&#23545;&#20110;&#26597;&#25214;&#19981;&#21487;&#35265;&#65288;&#38500;&#20102;&#32771;&#34385; X &#30340;<a href="cpp-language-adl.html">&#23454;&#21442;&#20381;&#36182;&#26597;&#25214;</a>&#65289;&#65292;&#38500;&#38750;&#22312;&#35813;&#21629;&#21517;&#31354;&#38388;&#20316;&#29992;&#22495;&#20013;&#25552;&#20379;&#19982;&#20043;&#21305;&#37197;&#30340;&#22768;&#26126;&mdash;&mdash;&#32454;&#33410;&#35265;<a href="cpp-language-namespace.html#.E5.91.BD.E5.90.8D.E7.A9.BA.E9.97.B4">&#21629;&#21517;&#31354;&#38388;</a>&#12290;</p>
<h3><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E5.8F.8B.E5.85.83">&#27169;&#26495;&#21451;&#20803;</span></h3>
<p><a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#19982;<a href="cpp-language-class_template.html">&#31867;&#27169;&#26495;</a>&#22768;&#26126;&#65292;&#37117;&#21487;&#24102; <code>friend</code> &#35828;&#26126;&#31526;&#20986;&#29616;&#20110;&#20219;&#20309;&#38750;&#23616;&#37096;&#31867;&#25110;&#31867;&#27169;&#26495;&#20869;&#65288;&#23613;&#31649;&#21482;&#26377;&#20989;&#25968;&#27169;&#26495;&#33021;&#22312;&#25480;&#20104;&#21451;&#20803;&#20851;&#31995;&#30340;&#31867;&#25110;&#31867;&#27169;&#26495;&#20869;&#36827;&#34892;&#23450;&#20041;&#65289;&#12290;&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;&#35813;&#27169;&#26495;&#30340;&#27599;&#20010;&#29305;&#21270;&#37117;&#25104;&#20026;&#21451;&#20803;&#65292;&#19981;&#31649;&#26159;&#34987;&#38544;&#24335;&#23454;&#20363;&#21270;&#12289;&#37096;&#20998;&#29305;&#21270;&#25110;&#26174;&#24335;&#29305;&#21270;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> A <span class="br0">{</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<span class="kw1">friend</span> <span class="kw1">class</span> B<span class="sy4">;</span> <span class="co1">// &#27599;&#20010; B&lt;T&gt; &#37117;&#26159; A &#30340;&#21451;&#20803;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<span class="kw1">friend</span> <span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span> <span class="co1">// &#27599;&#20010; f&lt;T&gt; &#37117;&#26159; A &#30340;&#21451;&#20803;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#21451;&#20803;&#22768;&#26126;&#19981;&#33021;&#25351;&#20195;&#37096;&#20998;&#29305;&#21270;&#65292;&#20294;&#33021;&#25351;&#20195;&#20840;&#29305;&#21270;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> A <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#20027;&#27169;&#26495;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> A<span class="sy1">&lt;</span>T<span class="sy2">*</span><span class="sy1">&gt;</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#37096;&#20998;&#29305;&#21270;</span>
<span class="kw1">template</span><span class="sy1">&lt;&gt;</span> <span class="kw1">class</span> A<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#20840;&#29305;&#21270;</span>
<span class="kw1">class</span> X <span class="br0">{</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw1">friend</span> <span class="kw1">class</span> A<span class="sy1">&lt;</span>T<span class="sy2">*</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65281;</span>
<span class="kw1">friend</span> <span class="kw1">class</span> A<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// OK</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#24403;&#21451;&#20803;&#22768;&#26126;&#25351;&#20195;&#20989;&#25968;&#27169;&#26495;&#30340;&#20840;&#29305;&#21270;&#26102;&#65292;&#19981;&#33021;&#20351;&#29992;&#20851;&#38190;&#35789; <code>inline</code> &#21644;&#40664;&#35748;&#23454;&#21442;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;&gt;</span> <span class="kw4">void</span> f<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">class</span> X <span class="br0">{</span>
<span class="kw1">friend</span> <span class="kw4">void</span> f<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="br0">(</span><span class="kw4">int</span> x <span class="sy1">=</span> <span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#19981;&#20801;&#35768;&#40664;&#35748;&#23454;&#21442;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#27169;&#26495;&#21451;&#20803;&#22768;&#26126;&#21487;&#20197;&#25351;&#21517;&#31867;&#27169;&#26495; A &#30340;&#25104;&#21592;&#65292;&#23427;&#21487;&#20197;&#26159;&#25104;&#21592;&#20989;&#25968;&#25110;&#25104;&#21592;&#31867;&#22411;&#65288;&#31867;&#22411;&#24517;&#39035;&#29992;<a href="cpp-language-elaborated_type_specifier.html">&#35814;&#36848;&#31867;&#22411;&#35828;&#26126;&#31526;</a>&#65289;&#12290;&#36825;&#31181;&#22768;&#26126;&#21482;&#26377;&#22312;&#23427;&#30340; <span class="t-spar">&#23884;&#22871;&#21517;&#35828;&#26126;&#31526;</span> &#20013;&#30340;&#26368;&#21518;&#32452;&#20998;&#65288;&#26368;&#21518;&#30340; <code><b>::</b></code> &#24038;&#36793;&#30340;&#21517;&#23383;&#65289;&#26159;&#19968;&#20010;&#25351;&#21517;&#35813;&#31867;&#27169;&#26495;&#30340; <span class="t-spar">&#31616;&#21333;&#27169;&#26495;&#26631;&#35782;</span>&#65288;&#27169;&#26495;&#21517;&#21518;&#38543;&#35282;&#25324;&#21495;&#21253;&#22260;&#30340;&#23454;&#21442;&#21015;&#34920;&#65289;&#26102;&#25165;&#26159;&#33391;&#26500;&#30340;&#12290;&#36825;&#31181;&#27169;&#26495;&#21451;&#20803;&#22768;&#26126;&#30340;&#27169;&#26495;&#24418;&#21442;&#24517;&#39035;&#33021;&#20174;&#35813; <span class="t-spar">&#31616;&#21333;&#27169;&#26495;&#26631;&#35782;</span> &#25512;&#23548;&#12290;</p>
<p>&#27492;&#26102; A &#30340;&#20219;&#20309;&#29305;&#21270;&#30340;&#25104;&#21592;&#37117;&#20250;&#25104;&#20026;&#21451;&#20803;&#12290;&#36825;&#19981;&#24182;&#28041;&#21450;&#23545;&#20027;&#27169;&#26495; A &#30340;&#23454;&#20363;&#21270;&#65306;&#21482;&#35201;&#27714;&#20174;&#35813;&#29305;&#21270;&#25512;&#23548; A &#30340;&#27169;&#26495;&#24418;&#21442;&#25104;&#21151;&#65292;&#20197;&#21450;&#23558;&#25512;&#23548;&#20986;&#30340;&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;&#21040;&#21451;&#20803;&#22768;&#26126;&#20013;&#25152;&#20135;&#29983;&#30340;&#22768;&#26126;&#65292;&#26159;&#35813;&#29305;&#21270;&#30340;&#25104;&#21592;&#30340;&#21512;&#27861;&#22768;&#26126;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#20027;&#27169;&#26495;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">struct</span> A <span class="br0">{</span>
<span class="kw1">struct</span> B <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">struct</span> D <span class="br0">{</span> <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
T h<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>T U<span class="sy1">&gt;</span> T i<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#20840;&#29305;&#21270;</span>
<span class="kw1">template</span><span class="sy1">&lt;&gt;</span>
<span class="kw1">struct</span> A<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="br0">{</span>
<span class="kw1">struct</span> B <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">struct</span> D <span class="br0">{</span> <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> U<span class="sy1">&gt;</span> <span class="kw4">int</span> i<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#21478;&#19968;&#20840;&#29305;&#21270;</span>
<span class="kw1">template</span><span class="sy1">&lt;&gt;</span>
<span class="kw1">struct</span> A<span class="sy1">&lt;</span><span class="kw4">float</span><span class="sy2">*</span><span class="sy1">&gt;</span> <span class="br0">{</span>
<span class="kw4">int</span> <span class="sy2">*</span>h<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#38750;&#27169;&#26495;&#31867;&#21521;&#31867;&#27169;&#26495; A &#30340;&#25104;&#21592;&#25480;&#20104;&#21451;&#20803;&#20851;&#31995;</span>
<span class="kw1">class</span> X <span class="br0">{</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">friend</span> <span class="kw1">struct</span> A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">B</span><span class="sy4">;</span> <span class="co1">// &#25152;&#26377;&#30340; A&lt;T&gt;::B &#37117;&#26159;&#21451;&#20803;&#65292;&#21253;&#25324; A&lt;int&gt;::B</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">friend</span> <span class="kw4">void</span> A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// A&lt;int&gt;::f() &#19981;&#26159;&#21451;&#20803;&#65292;&#22240;&#20026;&#20854;&#31614;&#21517;&#19981;&#21305;&#37197;&#65292;</span>
<span class="co1">// &#20294;&#27604;&#22914; A&lt;char&gt;::f() &#21017;&#26159;&#21451;&#20803;</span>
<span class="co1">// template&lt;class T&gt;</span>
<span class="co1">// friend void A&lt;T&gt;::D::g(); // &#38750;&#33391;&#26500;&#65306;&#23884;&#22871;&#21517;&#35828;&#26126;&#31526;&#30340;&#26368;&#21518;&#37096;&#20998;&#65292;</span>
<span class="co1">// // A&lt;T&gt;::D:: &#20013; &#30340; D&#65292;&#19981;&#26159;&#31616;&#21333;&#27169;&#26495;&#26631;&#35782;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">friend</span> <span class="kw4">int</span><span class="sy2">*</span> A<span class="sy1">&lt;</span>T<span class="sy2">*</span><span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">h</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25152;&#26377;&#30340; A&lt;T*&gt;::h &#37117;&#26159;&#21451;&#20803;&#65306;A&lt;float*&gt;::h()&#12289;A&lt;int*&gt;::h() &#31561;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>T U<span class="sy1">&gt;</span> <span class="co1">// A&lt;T&gt;::i() &#30340;&#25152;&#26377;&#23454;&#20363;&#21270;&#21644; A&lt;int&gt;::i() &#37117;&#26159;&#21451;&#20803;&#65292;</span>
<span class="kw1">friend</span> T A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">i</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#20174;&#32780;&#36825;&#20123;&#20989;&#25968;&#27169;&#26495;&#30340;&#25152;&#26377;&#29305;&#21270;&#37117;&#26159;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<p>&#21482;&#26377;&#22312;&#27169;&#26495;&#21451;&#20803;&#22768;&#26126;&#26159;&#23450;&#20041;&#65292;&#19988;&#27492;&#32763;&#35793;&#21333;&#20803;&#19981;&#20986;&#29616;&#27492;&#20989;&#25968;&#27169;&#26495;&#30340;&#20854;&#20182;&#22768;&#26126;&#26102;&#65292;&#35813;&#22768;&#26126;&#20013;&#25165;&#20801;&#35768;&#20351;&#29992;<a href="cpp-language-template_parameters.html#.E9.BB.98.E8.AE.A4.E6.A8.A1.E6.9D.BF.E5.AE.9E.E5.8F.82">&#40664;&#35748;&#27169;&#26495;&#23454;&#21442;</a>&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E5.8F.8B.E5.85.83.E8.BF.90.E7.AE.97.E7.AC.A6">&#27169;&#26495;&#21451;&#20803;&#36816;&#31639;&#31526;</span></h3>
<p>&#27169;&#26495;&#21451;&#20803;&#30340;&#19968;&#31181;&#24120;&#35265;&#20351;&#29992;&#22330;&#21512;&#26159;&#20316;&#29992;&#20110;&#31867;&#27169;&#26495;&#19978;&#30340;&#38750;&#25104;&#21592;&#36816;&#31639;&#31526;&#37325;&#36733;&#30340;&#22768;&#26126;&#65292;&#20363;&#22914;&#38024;&#23545;&#26576;&#20010;&#29992;&#25143;&#23450;&#20041;&#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp">Foo<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span></span></span> &#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp">operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span>, <span class="kw4">const</span> Foo<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span><span class="br0">)</span></span></span>&#12290;</p>
<p>&#36825;&#31181;&#36816;&#31639;&#31526;&#21487;&#20197;&#22312;&#31867;&#20307;&#20869;&#23450;&#20041;&#65292;&#25928;&#26524;&#26159;&#23545;&#27599;&#20010; <code>T</code> &#29983;&#25104;&#29420;&#31435;&#30340;&#38750;&#27169;&#26495; <code>operator&lt;&lt;</code>&#65292;&#24182;&#20351;&#35813;&#38750;&#27169;&#26495; <code>operator&lt;&lt;</code> &#20026;&#20854; <code>Foo&lt;T&gt;</code> &#30340;&#21451;&#20803;&#65306;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<span class="kw1">class</span> Foo <span class="br0">{</span>
<span class="kw1">public</span><span class="sy4">:</span>
Foo<span class="br0">(</span><span class="kw4">const</span> T<span class="sy3">&amp;</span> val<span class="br0">)</span> <span class="sy4">:</span> data<span class="br0">(</span>val<span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="kw1">private</span><span class="sy4">:</span>
T data<span class="sy4">;</span>
<span class="co1">// &#20026;&#36825;&#20010; T &#29983;&#25104;&#38750;&#27169;&#26495; operator&lt;&lt; </span>
<span class="kw1">friend</span> <a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> os, <span class="kw4">const</span> Foo<span class="sy3">&amp;</span> obj<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">return</span> os <span class="sy1">&lt;&lt;</span> obj.<span class="me1">data</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
Foo<span class="sy1">&lt;</span><span class="kw4">double</span><span class="sy1">&gt;</span> obj<span class="br0">(</span><span class="nu16">1.23</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> obj <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">1.23</pre></div>
</div>
</div>
<p>&#21542;&#21017;&#65292;&#20989;&#25968;&#27169;&#26495;&#38656;&#35201;&#31867;&#20307;&#20043;&#21069;&#22768;&#26126;&#20026;&#27169;&#26495;&#65292;&#36825;&#31181;&#24773;&#20917;&#19979; <code>Foo&lt;T&gt;</code> &#20869;&#30340;&#21451;&#20803;&#22768;&#26126;&#21487;&#20197;&#28041;&#25351; <code>operator&lt;&lt;</code> &#23545;&#20854; <code>T</code> &#30340;&#20840;&#29305;&#21270;&#65306;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<span class="kw1">class</span> Foo<span class="sy4">;</span> <span class="co1">// &#21069;&#32622;&#22768;&#26126;&#65292;&#20197;&#30830;&#20445;&#20989;&#25968;&#22768;&#26126;&#21487;&#34892;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="co1">// &#22768;&#26126;</span>
<a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span>, <span class="kw4">const</span> Foo<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<span class="kw1">class</span> Foo <span class="br0">{</span>
<span class="kw1">public</span><span class="sy4">:</span>
Foo<span class="br0">(</span><span class="kw4">const</span> T<span class="sy3">&amp;</span> val<span class="br0">)</span> <span class="sy4">:</span> data<span class="br0">(</span>val<span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="kw1">private</span><span class="sy4">:</span>
T data<span class="sy4">;</span>
<span class="co1">// &#28041;&#25351;&#23545;&#20110;&#36825;&#20010;&#29305;&#23450;&#30340; T &#30340;&#20840;&#29305;&#21270; </span>
<span class="kw1">friend</span> <a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span> <span class="sy1">&lt;&gt;</span> <span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span>, <span class="kw4">const</span> Foo<span class="sy3">&amp;</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#27880;&#24847;&#65306;&#36825;&#20381;&#36182;&#20110;&#22768;&#26126;&#20013;&#30340;&#27169;&#26495;&#23454;&#21442;&#25512;&#23548;</span>
<span class="co1">// &#20063;&#21487;&#20197;&#36890;&#36807; operator&lt;&lt; &lt;T&gt; &#25351;&#23450;&#27169;&#26495;&#23454;&#21442;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#23450;&#20041;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span>
<a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> os, <span class="kw4">const</span> Foo<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy3">&amp;</span> obj<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">return</span> os <span class="sy1">&lt;&lt;</span> obj.<span class="me1">data</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
Foo<span class="sy1">&lt;</span><span class="kw4">double</span><span class="sy1">&gt;</span> obj<span class="br0">(</span><span class="nu16">1.23</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> obj <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">&#31034;&#20363;</span></h3>
<div class="t-example">
<p>&#27969;&#25554;&#20837;&#19982;&#25552;&#21462;&#36816;&#31639;&#31526;&#24448;&#24448;&#22768;&#26126;&#20026;&#38750;&#25104;&#21592;&#21451;&#20803;&#65306;</p>
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;sstream&gt;</span>
<span class="kw1">class</span> MyClass <span class="br0">{</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="kw1">friend</span> <a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> out, <span class="kw4">const</span> MyClass<span class="sy3">&amp;</span> o<span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">friend</span> <a href="cpp-io-basic_istream.html"><span class="kw1727">std::<span class="me2">istream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&gt;&gt;</span><span class="br0">(</span><a href="cpp-io-basic_istream.html"><span class="kw1727">std::<span class="me2">istream</span></span></a><span class="sy3">&amp;</span> in, MyClass<span class="sy3">&amp;</span> o<span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">public</span><span class="sy4">:</span>
MyClass<span class="br0">(</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">)</span> <span class="sy4">:</span> i<span class="br0">(</span>i<span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&lt;&lt;</span><span class="br0">(</span><a href="cpp-io-basic_ostream.html"><span class="kw1729">std::<span class="me2">ostream</span></span></a><span class="sy3">&amp;</span> out, <span class="kw4">const</span> MyClass<span class="sy3">&amp;</span> mc<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">return</span> out <span class="sy1">&lt;&lt;</span> mc.<span class="me1">i</span><span class="sy4">;</span>
<span class="br0">}</span>
<a href="cpp-io-basic_istream.html"><span class="kw1727">std::<span class="me2">istream</span></span></a><span class="sy3">&amp;</span> operator<span class="sy1">&gt;&gt;</span><span class="br0">(</span><a href="cpp-io-basic_istream.html"><span class="kw1727">std::<span class="me2">istream</span></span></a><span class="sy3">&amp;</span> in, MyClass<span class="sy3">&amp;</span> mc<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw1">return</span> in <span class="sy1">&gt;&gt;</span> mc.<span class="me1">i</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
MyClass mc<span class="br0">(</span><span class="nu0">7</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> mc <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<a href="cpp-io-basic_istringstream.html"><span class="kw1735">std::<span class="me2">istringstream</span></span></a><span class="br0">(</span><span class="st0">&quot;100&quot;</span><span class="br0">)</span> <span class="sy1">&gt;&gt;</span> mc<span class="sy4">;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> mc <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">7
100</pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">&#32570;&#38519;&#25253;&#21578;</span></h3>
<p>&#19979;&#21015;&#26356;&#25913;&#34892;&#20026;&#30340;&#32570;&#38519;&#25253;&#21578;&#36861;&#28335;&#22320;&#24212;&#29992;&#20110;&#20197;&#21069;&#20986;&#29256;&#30340; C++ &#26631;&#20934;&#12290;</p>
<table class="dsctable" style="font-size:0.8em">
<tr>
<th>DR</th>
<th>&#24212;&#29992;&#20110;</th>
<th>&#20986;&#29256;&#26102;&#30340;&#34892;&#20026;</th>
<th>&#27491;&#30830;&#34892;&#20026;</th>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue45">CWG 45</a></td>
<td>C++98</td>
<td><code>T</code> &#30340;&#21451;&#20803;&#31867;&#30340;&#23884;&#22871;&#31867;&#30340;&#25104;&#21592;&#23545; <code>T</code> &#27809;&#26377;&#29305;&#27530;&#35775;&#38382;&#26435;</td>
<td>&#23884;&#22871;&#31867;&#25317;&#26377;&#21644;&#22806;&#22260;&#31867;&#30456;&#21516;&#30340;&#35775;&#38382;&#26435;</td>
</tr>
<tr>
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue500">CWG 500</a></td>
<td>C++98</td>
<td><code>T</code> &#30340;&#21451;&#20803;&#31867;&#19981;&#33021;&#32487;&#25215;&#33258; <code>T</code> &#30340;&#31169;&#26377;&#19982;&#21463;&#20445;&#25252;&#25104;&#21592;&#65292;&#20294;&#20854;&#23884;&#22871;&#31867;&#21487;&#20197;</td>
<td>&#37117;&#21487;&#20197;&#32487;&#25215;&#33258;&#27492;&#31867;&#25104;&#21592;</td>
</tr>
</table>
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">&#24341;&#29992;</span></h3>
<div class="t-ref-std-c++11">
<ul>
<li>C++11 &#26631;&#20934;&#65288;ISO/IEC 14882:2011&#65289;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>11.3 Friends [class.friend]</li>
</ul>
</dd>
</dl>
<dl>
<dd>
<ul>
<li>14.5.4 Friends [temp.friend]</li>
</ul>
</dd>
</dl>
</div>
<div class="t-ref-std-c++98">
<ul>
<li>C++98 &#26631;&#20934;&#65288;ISO/IEC 14882:1998&#65289;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>11.3 Friends [class.friend]</li>
</ul>
</dd>
</dl>
<dl>
<dd>
<ul>
<li>14.5.3 Friends [temp.friend]</li>
</ul>
</dd>
</dl>
</div>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc">
<td><a href="cpp-language-class.html">&#31867;&#31867;&#22411;</a></td>
<td>&#23450;&#20041;&#20445;&#26377;&#25968;&#20010;&#25968;&#25454;&#25104;&#21592;&#30340;&#31867;&#22411;</td>
</tr>
<tr class="t-dsc">
<td><a href="cpp-language-access.html">&#35775;&#38382;&#35828;&#26126;&#31526;</a></td>
<td>&#23450;&#20041;&#31867;&#25104;&#21592;&#30340;&#21487;&#35265;&#24615;</td>
</tr>
</table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>