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

158 lines
13 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>&#23884;&#22871;&#31867;</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_nested_types skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#23884;&#22871;&#31867;</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><a href="cpp-language-class.html">class/struct</a> &#25110; <a href="cpp-language-union.html">union</a> &#30340;&#22768;&#26126;&#21487;&#20197;&#22312;&#21478;&#19968;&#20010;&#31867;&#20013;&#20986;&#29616;&#12290;&#36825;&#31181;&#22768;&#26126;&#22768;&#26126;&#19968;&#20010;<i>&#23884;&#22871;&#31867;&#65288;nested class&#65289;</i>&#12290;</p>
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">&#35299;&#37322;</span></h3>
<p>&#23884;&#22871;&#31867;&#30340;&#21517;&#23383;&#22312;&#23427;&#30340;&#22806;&#22260;&#31867;&#20316;&#29992;&#22495;&#20013;&#23384;&#22312;&#65292;&#32780;&#19988;&#20174;&#23884;&#22871;&#31867;&#30340;&#25104;&#21592;&#20989;&#25968;&#20013;&#36827;&#34892;&#21517;&#23383;&#26597;&#25214;&#20250;&#22312;&#26816;&#27979;&#23884;&#22871;&#31867;&#30340;&#20316;&#29992;&#22495;&#21518;&#35775;&#38382;&#22806;&#22260;&#31867;&#30340;&#20316;&#29992;&#22495;&#12290;&#19982;&#20854;&#22806;&#22260;&#31867;&#30340;&#20219;&#20309;&#25104;&#21592;&#30456;&#20284;&#65292;&#23884;&#22871;&#31867;&#20063;&#25317;&#26377;&#25152;&#26377;&#22806;&#22260;&#31867;&#25317;&#26377;&#35775;&#38382;&#26435;&#30340;&#21517;&#23383;&#65288;&#31169;&#26377;&#12289;&#21463;&#20445;&#25252;&#31561;&#65289;&#30340;&#35775;&#38382;&#26435;&#65292;&#20294;&#20854;&#20182;&#26041;&#38754;&#23427;&#26159;&#29420;&#31435;&#30340;&#65292;&#32780;&#19988;&#23545;&#22806;&#22260;&#31867;&#30340; <a href="cpp-language-this.html">this</a> &#25351;&#38024;&#27809;&#26377;&#29305;&#27530;&#35775;&#38382;&#26435;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx11">
<td>&#23884;&#22871;&#31867;&#20013;&#30340;&#22768;&#26126;&#21482;&#33021;&#20351;&#29992;&#22806;&#22260;&#31867;&#20013;&#30340;&#31867;&#22411;&#21517;&#12289;&#38745;&#24577;&#25104;&#21592;&#21450;&#26522;&#20030;&#39033;&#12290;</td>
<td><span class="t-mark-rev t-until-cxx11">(C++11 &#21069;)</span></td>
</tr>
<tr class="t-rev t-since-cxx11">
<td>
<p>&#23884;&#22871;&#31867;&#20013;&#30340;&#22768;&#26126;&#33021;&#20351;&#29992;&#22806;&#22260;&#31867;&#30340;&#25152;&#26377;&#25104;&#21592;&#65292;&#36981;&#24490;&#38750;&#38745;&#24577;&#25104;&#21592;&#30340;<a href="cpp-language-data_members.html#.E7.94.A8.E6.B3.95">&#24120;&#35268;&#20351;&#29992;&#35268;&#21017;</a>&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">int</span> x,y<span class="sy4">;</span> <span class="co1">// &#20840;&#23616;&#21464;&#37327;</span>
<span class="kw1">class</span> enclose <span class="co1">// &#22806;&#22260;&#31867;</span>
<span class="br0">{</span>
<span class="co1">// &#27880;&#65306;&#31169;&#26377;&#25104;&#21592;</span>
<span class="kw4">int</span> x<span class="sy4">;</span>
<span class="kw4">static</span> <span class="kw4">int</span> s<span class="sy4">;</span>
<span class="kw1">public</span><span class="sy4">:</span>
<span class="kw1">struct</span> inner <span class="co1">// &#23884;&#22871;&#31867;</span>
<span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span> i<span class="br0">)</span>
<span class="br0">{</span>
x <span class="sy1">=</span> i<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#19981;&#33021;&#19981;&#24102;&#23454;&#20363;&#22320;&#20889;&#20837;&#38750;&#38745;&#24577;&#30340; enclose::x</span>
<span class="kw4">int</span> a <span class="sy1">=</span> sizeof x<span class="sy4">;</span> <span class="co1">// C++11 &#21069;&#38169;&#35823;&#65292;C++11 &#20013; OK&#65306;sizeof &#30340;&#25805;&#20316;&#25968;&#19981;&#27714;&#20540;&#65292;</span>
<span class="co1">// &#21487;&#20197;&#36825;&#26679;&#20351;&#29992;&#38750;&#38745;&#24577;&#30340; enclose::x &#12290;</span>
s <span class="sy1">=</span> i<span class="sy4">;</span> <span class="co1">// OK&#65306;&#21487;&#20197;&#36171;&#20540;&#32473;&#38745;&#24577; enclose::s</span>
<span class="sy4">::</span><span class="me2">x</span> <span class="sy1">=</span> i<span class="sy4">;</span> <span class="co1">// OK&#65306;&#21487;&#20197;&#36171;&#20540;&#32473;&#20840;&#23616; x</span>
y <span class="sy1">=</span> i<span class="sy4">;</span> <span class="co1">// OK&#65306;&#21487;&#20197;&#36171;&#20540;&#32473;&#20840;&#23616; y</span>
<span class="br0">}</span>
<span class="kw4">void</span> g<span class="br0">(</span>enclose<span class="sy2">*</span> p, <span class="kw4">int</span> i<span class="br0">)</span>
<span class="br0">{</span>
p<span class="sy2">-</span><span class="sy1">&gt;</span>x <span class="sy1">=</span> i<span class="sy4">;</span> <span class="co1">// OK&#65306;&#36171;&#20540;&#32473; enclose::x</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#22312;&#23884;&#22871;&#31867;&#20013;&#23450;&#20041;&#30340;<a href="cpp-language-friend.html">&#21451;&#20803;&#20989;&#25968;</a>&#23545;&#22806;&#22260;&#31867;&#30340;&#25104;&#21592;&#27809;&#26377;&#29305;&#27530;&#35775;&#38382;&#26435;&#65292;&#34429;&#28982;&#26469;&#33258;&#22312;&#23884;&#22871;&#31867;&#20013;&#23450;&#20041;&#30340;&#25104;&#21592;&#20989;&#25968;&#20307;&#20869;&#30340;&#26597;&#25214;&#33021;&#25214;&#21040;&#22806;&#22260;&#31867;&#30340;&#31169;&#26377;&#25104;&#21592;&#12290;</p>
<p>&#23884;&#22871;&#31867;&#25104;&#21592;&#30340;&#31867;&#22806;&#23450;&#20041;&#22312;&#22806;&#22260;&#31867;&#30340;&#21629;&#21517;&#31354;&#38388;&#20013;&#20986;&#29616;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> enclose
<span class="br0">{</span>
<span class="kw1">struct</span> inner
<span class="br0">{</span>
<span class="kw4">static</span> <span class="kw4">int</span> x<span class="sy4">;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span> i<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> enclose<span class="sy4">::</span><span class="me2">inner</span><span class="sy4">::</span><span class="me2">x</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// &#23450;&#20041;</span>
<span class="kw4">void</span> enclose<span class="sy4">::</span><span class="me2">inner</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="kw4">int</span> i<span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span> <span class="co1">// &#23450;&#20041;</span></pre></div>
</div>
<p>&#23884;&#22871;&#31867;&#21487;&#20197;&#21069;&#32622;&#22768;&#26126;&#24182;&#22312;&#20043;&#21518;&#23450;&#20041;&#65292;&#22312;&#22806;&#22260;&#31867;&#30340;&#20307;&#20869;&#25110;&#20307;&#22806;&#22343;&#21487;&#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> enclose
<span class="br0">{</span>
<span class="kw1">class</span> nested1<span class="sy4">;</span> <span class="co1">// &#21069;&#32622;&#22768;&#26126;</span>
<span class="kw1">class</span> nested2<span class="sy4">;</span> <span class="co1">// &#21069;&#32622;&#22768;&#26126;</span>
<span class="kw1">class</span> nested1 <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#23884;&#22871;&#31867;&#30340;&#23450;&#20041;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">class</span> enclose<span class="sy4">::</span><span class="me2">nested2</span> <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#23884;&#22871;&#31867;&#30340;&#23450;&#20041;</span></pre></div>
</div>
<p>&#23884;&#22871;&#31867;&#22768;&#26126;&#26381;&#20174;<a href="cpp-language-access.html">&#25104;&#21592;&#35775;&#38382;</a>&#35828;&#26126;&#31526;&#65292;&#20174;&#22806;&#22260;&#31867;&#30340;&#20316;&#29992;&#22495;&#20043;&#22806;&#19981;&#33021;&#25351;&#21517;&#31169;&#26377;&#30340;&#25104;&#21592;&#31867;&#65292;&#23613;&#31649;&#21487;&#20197;&#25805;&#20316;&#35813;&#31867;&#30340;&#23545;&#35937;&#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> enclose
<span class="br0">{</span>
<span class="kw1">struct</span> nested <span class="co1">// &#31169;&#26377;&#25104;&#21592;</span>
<span class="br0">{</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">public</span><span class="sy4">:</span>
<span class="kw4">static</span> nested f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> nested<span class="br0">{</span><span class="br0">}</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>
<span class="co1">//enclose::nested n1 = e.f(); // &#38169;&#35823;&#65306;&#39;nested&#39; &#26159;&#31169;&#26377;&#30340;</span>
enclose<span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">g</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#27809;&#26377;&#25351;&#21517; &#39;nested&#39;</span>
<span class="kw4">auto</span> n2 <span class="sy1">=</span> enclose<span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#27809;&#26377;&#25351;&#21517; &#39;nested&#39;</span>
n2.<span class="me1">g</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></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>&#23884;&#22871;&#31867;&#30340;&#25104;&#21592;&#26080;&#27861;&#35775;&#38382;&#22806;&#22260;&#31867;&#21450;&#20854;&#21451;&#20803;</td>
<td>&#23427;&#20204;&#21644;&#22806;&#22260;&#31867;&#30340;&#20854;&#20182;&#25104;&#21592;&#26377;&#30456;&#21516;&#30340;&#35775;&#38382;&#26435;&#38480;<br />
&#65288;&#21516;&#26102;&#35299;&#20915;&#20102; CWG &#30340;8&#21495;&#21644;10&#21495;&#38382;&#39064;&#65289;</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>9.7 Nested class declarations [class.nest]</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>9.7 Nested class declarations [class.nest]</li>
</ul>
</dd>
</dl>
</div>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>