<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AcceleratedC%2B%2B%2FChapter14</id>
	<title>AcceleratedC++/Chapter14 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AcceleratedC%2B%2B%2FChapter14"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter14&amp;action=history"/>
	<updated>2026-05-14T11:05:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter14&amp;diff=84048&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0001 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter14&amp;diff=84048&amp;oldid=prev"/>
		<updated>2026-03-26T23:56:00Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0001 pages from live compare&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:56, 26 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l29&quot;&gt;Line 29:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 29:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * 포인터를 복사하는 것은 그 대상 객체를 복사하는 것과는 다름. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* 포인터의 소멸이 그 객체의 소멸을 의미하지 않는다. (memory leak) &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* 포인터 소멸시키지 않고, 객체를 소멸할경우 dangling pointer 발생. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* 포인터 생성시 초기화하지 않으면, 포인터를 바인딩되지 않은 상태가된다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * 포인터를 복사하는 것은 그 대상 객체를 복사하는 것과는 다름. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* 포인터의 소멸이 그 객체의 소멸을 의미하지 않는다. (memory leak) &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* 포인터 소멸시키지 않고, 객체를 소멸할경우 dangling pointer 발생. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* 포인터 생성시 초기화하지 않으면, 포인터를 바인딩되지 않은 상태가된다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;마지막 2가지의 경우는 그 포인터를 다른 곳에서 참조할 경우 어떤 일이 일어날지 알 수 없다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;마지막 2가지의 경우는 그 포인터를 다른 곳에서 참조할 경우 어떤 일이 일어날지 알 수 없다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l41&quot;&gt;Line 41:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 41:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * Handle은 객체의 참조값 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* Handle은 복사가 가능하다 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* Handle 객체가 다른 객체에 바인딩되어 있는지 확인이 가능 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* Handle클래스가 가리키는 객체가 상속구조의 클래스형을 가리킨다면 virtual 에 의해 지정된 연산에대해서 다형성을 제공한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * Handle은 객체의 참조값 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* Handle은 복사가 가능하다 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* Handle 객체가 다른 객체에 바인딩되어 있는지 확인이 가능 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* Handle클래스가 가리키는 객체가 상속구조의 클래스형을 가리킨다면 virtual 에 의해 지정된 연산에대해서 다형성을 제공한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l156&quot;&gt;Line 156:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 156:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	for (vector&amp;amp;lt; Handle&amp;amp;lt;Core&amp;amp;gt; &amp;amp;gt;::size_type i = 0;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	for (vector&amp;amp;lt; Handle&amp;amp;lt;Core&amp;amp;gt; &amp;amp;gt;::size_type i = 0;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	     i != students.size(); ++i) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	     i != students.size(); ++i) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		// `students&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;&amp;#039; is a `Handle&amp;#039;, which we dereference to call the functions&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		// `students&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;&amp;#039; is a `Handle&amp;#039;, which we dereference to call the functions&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		cout &amp;amp;lt;&amp;amp;lt; students&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;-&amp;amp;gt;name()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		cout &amp;amp;lt;&amp;amp;lt; students&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;-&amp;amp;gt;name()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		     &amp;amp;lt;&amp;amp;lt; string(maxlen + 1 - students&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;-&amp;amp;gt;name().size(), &amp;#039; &amp;#039;);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		     &amp;amp;lt;&amp;amp;lt; string(maxlen + 1 - students&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;-&amp;amp;gt;name().size(), &amp;#039; &amp;#039;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		try {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		try {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  			double final_grade = students&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;-&amp;amp;gt;grade();&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  			double final_grade = students&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;-&amp;amp;gt;grade();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  			streamsize prec = cout.precision();&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  			streamsize prec = cout.precision();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  			cout &amp;amp;lt;&amp;amp;lt; setprecision(3) &amp;amp;lt;&amp;amp;lt; final_grade&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  			cout &amp;amp;lt;&amp;amp;lt; setprecision(3) &amp;amp;lt;&amp;amp;lt; final_grade&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l449&quot;&gt;Line 449:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 449:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	// call `make_unique&amp;#039; as necessary&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	// call `make_unique&amp;#039; as necessary&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	char&amp;amp;amp; operator&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[]&lt;/del&gt;(size_type i) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	char&amp;amp;amp; operator&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#93;&lt;/ins&gt;(size_type i) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		data.make_unique();&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		data.make_unique();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		return (*data)&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		return (*data)&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	const char&amp;amp;amp; operator&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[]&lt;/del&gt;(size_type i) const { return (*data)&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;; }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	const char&amp;amp;amp; operator&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#93;&lt;/ins&gt;(size_type i) const { return (*data)&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	size_type size() const { return data-&amp;amp;gt;size(); }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  	size_type size() const { return data-&amp;amp;gt;size(); }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l534&quot;&gt;Line 534:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 534:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * Ptr&amp;lt;T&amp;gt;::make_unique()를 사용하지 않는다면 T::clone은 불필요 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* Ptr&amp;lt;T&amp;gt;::make_unique를 사용한다면 T::clone가 있다면 T::clone을 사용할 것이다. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;&lt;/del&gt;BR/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; &lt;/del&gt;* Ptr&amp;lt;T&amp;gt;::make_unique를 사용한다면 T::clone가 미정의되었다면 clone&amp;lt;T&amp;gt;를 정의해서 원하는 바를 얻을 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * Ptr&amp;lt;T&amp;gt;::make_unique()를 사용하지 않는다면 T::clone은 불필요 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* Ptr&amp;lt;T&amp;gt;::make_unique를 사용한다면 T::clone가 있다면 T::clone을 사용할 것이다. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;BR/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;* Ptr&amp;lt;T&amp;gt;::make_unique를 사용한다면 T::clone가 미정의되었다면 clone&amp;lt;T&amp;gt;를 정의해서 원하는 바를 얻을 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter14&amp;diff=83180&amp;oldid=prev</id>
		<title>Maintenance script: Repair MoniWiki formatting after migration</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter14&amp;diff=83180&amp;oldid=prev"/>
		<updated>2026-03-26T14:01:35Z</updated>

		<summary type="html">&lt;p&gt;Repair MoniWiki formatting after migration&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:01, 26 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l500&quot;&gt;Line 500:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 500:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  #endif&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  #endif&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;기본 인터페이스는 이전의 Str과 동일하지만 자료구조가 Ptr&amp;lt; Vec&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;lt;&lt;/del&gt;char&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt; &lt;/del&gt;&amp;gt; 형으로 정의되었기 때문에 전체적인 메소드의 세부 구현이 많이 변경되었다. 그리고 Ptr템플릿으로 자료구조를 다룸으로서 Str클래스가 동일한 객체를 가리킬 수 있는 기능을 제공한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;기본 인터페이스는 이전의 Str과 동일하지만 자료구조가 Ptr&amp;lt; Vec&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;char&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/ins&gt;&amp;gt; 형으로 정의되었기 때문에 전체적인 메소드의 세부 구현이 많이 변경되었다. 그리고 Ptr템플릿으로 자료구조를 다룸으로서 Str클래스가 동일한 객체를 가리킬 수 있는 기능을 제공한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  === 14.4.1 제어할 수 없는 타입 복사하기 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  === 14.4.1 제어할 수 없는 타입 복사하기 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l529&quot;&gt;Line 529:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 529:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;#039;&amp;#039;&amp;#039;템플릿의 구체화(template specialization)&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;#039;&amp;#039;&amp;#039;템플릿의 구체화(template specialization)&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  template&amp;lt;&amp;gt;를 사용하면 특정 인자 타입에 대한 특정 템플릿 함수의 버전을 정의한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  template&amp;lt;&amp;gt;를 사용하면 특정 인자 타입에 대한 특정 템플릿 함수의 버전을 정의한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  이렇게 만들어진 함순느 만약 Vec&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;lt;&lt;/del&gt;char&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;&lt;/del&gt;*가 인자로 오는 경우에는 이 것이 실행되고 다른 버전의 템플릿이 오는 경우에는 그 객체의 clone()버전을 실행하게 된다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  이렇게 만들어진 함순느 만약 Vec&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;char&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt;&lt;/ins&gt;*가 인자로 오는 경우에는 이 것이 실행되고 다른 버전의 템플릿이 오는 경우에는 그 객체의 clone()버전을 실행하게 된다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;#039;&amp;#039;&amp;#039;이러한 사항을 요약하면 다음과 같다&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;#039;&amp;#039;&amp;#039;이러한 사항을 요약하면 다음과 같다&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * Ptr&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;lt;&lt;/del&gt;T&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;&lt;/del&gt;::make_unique()를 사용하지 않는다면 T::clone은 불필요 &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Ptr&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;lt;&lt;/del&gt;T&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;&lt;/del&gt;::make_unique를 사용한다면 T::clone가 있다면 T::clone을 사용할 것이다. &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Ptr&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;lt;&lt;/del&gt;T&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;&lt;/del&gt;::make_unique를 사용한다면 T::clone가 미정의되었다면 clone&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;lt;&lt;/del&gt;T&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;&lt;/del&gt;를 정의해서 원하는 바를 얻을 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| * Ptr&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;T&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt;&lt;/ins&gt;::make_unique()를 사용하지 않는다면 T::clone은 불필요 &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Ptr&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;T&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt;&lt;/ins&gt;::make_unique를 사용한다면 T::clone가 있다면 T::clone을 사용할 것이다. &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Ptr&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;T&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt;&lt;/ins&gt;::make_unique를 사용한다면 T::clone가 미정의되었다면 clone&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;T&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt;&lt;/ins&gt;를 정의해서 원하는 바를 얻을 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l542&quot;&gt;Line 542:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 542:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[AcceleratedC++]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[AcceleratedC++]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter14&amp;diff=27492&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter14&amp;diff=27492&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[AcceleratedC++/Chapter13]]&lt;br /&gt;
| [[AcceleratedC++/Chapter15]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Chapter 14 Managing memory (almost) automatically =&lt;br /&gt;
Student_info 클래스는 레코드의 인터페이스. 레코드의 메모리 공간을 관리한다.&lt;br /&gt;
이렇게 2가지의 추상적인 기능을 조합해서 만들게 되는 것은 허술한 클래스 설계때문인 경우가 많다.&lt;br /&gt;
&lt;br /&gt;
이 장에서는 포인터처럼 동작하지만, 자체 메모리 관리를 포함하는 클래스를 작성하려고 합니다.&lt;br /&gt;
내부의 한 개체를 가리키는 포인터와 비슷한 객체를 적절히 사용하면 불필요한 복사가 행해지는 성능상의 문제를 해결할 수 있다.&lt;br /&gt;
&lt;br /&gt;
만약 객체 x가 y를 가리킨다면 x를 복사한다고 해서 y도 볼사될까?&lt;br /&gt;
만약 y가 x의 멤버라면 이는 옳다. 그렇지만 어쩌다가 y를 가리키게 된 경우라면 이는 옳지 않다.&lt;br /&gt;
&lt;br /&gt;
이장의 내용은 상당히 추상적이기 때문에 상당히 주의 깊은 이해가 필요하다.&lt;br /&gt;
&lt;br /&gt;
== 14.1 Handles that copy their objects ==&lt;br /&gt;
13장에서 문제를 해결하기위해서는 서로 다른 타입의 객체를 한개의 컬렉션에 젖하는 방법이 필요했다.&lt;br /&gt;
13.3.1절의 첫번째 해결법에선느 이를 위해서 포인터를 사용하여서 Core 혹은 Core로 부터 파생된 객체들을 생성하여 컬렉션 내부의 포인터들로 가리키도록 하였다. 따라서 이 경우 사용자 코드는 객체의 동적생성, 해제에 관련된 것들을 처리할 책임이 있었다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;저수준 자료구조인 포인터를 직접상요함으로서 생기는 문제점&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| * 포인터를 복사하는 것은 그 대상 객체를 복사하는 것과는 다름. &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * 포인터의 소멸이 그 객체의 소멸을 의미하지 않는다. (memory leak) &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * 포인터 소멸시키지 않고, 객체를 소멸할경우 dangling pointer 발생. &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * 포인터 생성시 초기화하지 않으면, 포인터를 바인딩되지 않은 상태가된다.&lt;br /&gt;
|}&lt;br /&gt;
마지막 2가지의 경우는 그 포인터를 다른 곳에서 참조할 경우 어떤 일이 일어날지 알 수 없다.&lt;br /&gt;
&lt;br /&gt;
13.5의 Student_info 는 프로그래머가 내부의 Core객체를 볼 수없고, 자동으로 메모리 관리가 되도록은 했으나, 메소드들이 Core클래스의 public연산들을 그대로 따르는 것들이 많다.&lt;br /&gt;
이장에서는 이런 핸들(handle)클래스를 일반적인 방식으로 관리하는 것을 알게 된다.&lt;br /&gt;
 === 14.1.1 제네릭 핸들 클래스(generic handle class) ===&lt;br /&gt;
 이 클래스는 객체의 형에 무관한게 동작하여야 하므로 템플릿으로 작성한다.&lt;br /&gt;
 &lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Handle 클래스의 요구사항&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| * Handle은 객체의 참조값 &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Handle은 복사가 가능하다 &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Handle 객체가 다른 객체에 바인딩되어 있는지 확인이 가능 &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Handle클래스가 가리키는 객체가 상속구조의 클래스형을 가리킨다면 virtual 에 의해 지정된 연산에대해서 다형성을 제공한다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 사용자가 Handle 클래스를 이용해서 특정한 개체에 Handle을 붙이게 되면 Handle은 그 객체의 메모리를 관리하게 된다.&lt;br /&gt;
 대신 일단 그 객체는 오직 하나의 Handle만을 부착시켜야 하며, 일단 부착시킨 뒤에는 포인터가아닌 Handle을 이요해서 객체에 접근해야한다.&lt;br /&gt;
 즉 Handle이 소멸되면 Handle이 가리키는 객체도 소멸되게 된다. 사용자는 바인딩이 안된 객체를 가리키는 핸들을 만들수는 있지만 이 경우 핸들에 접근하게되면 예외 상황을 발생하게된다. (아니면 처음 생성시 객체가 바인딩 되어있는지를 검사하도록 하면 된다.)&lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt; class Handle {&lt;br /&gt;
 public:&lt;br /&gt;
 	Handle(): p(0) { }	// 기본생성자는 내부 멤버를 0으로 초기화하여서 아직 바인딩이 안된 상태임을 나타낸다.&lt;br /&gt;
 	Handle(const Handle&amp;amp;amp; s) : p(0) { if (s.p) p = s.p-&amp;amp;gt;clone(); }	// 복사 생성자는 인자로 받은 객체의 clone() 함수를 통해서 새로운 객체를 생성하고 그 것을 대입한다.&lt;br /&gt;
 	Handle&amp;amp;amp; operator=(const Handle&amp;amp;amp;);&lt;br /&gt;
 	~Handle() { delete p; }&lt;br /&gt;
 &lt;br /&gt;
 	Handle(T* t):p(t) { }&lt;br /&gt;
 &lt;br /&gt;
 	operator bool() const { return p; }&lt;br /&gt;
 	T&amp;amp;amp; operator*() const;&lt;br /&gt;
 	T* operator-&amp;amp;gt;() const;&lt;br /&gt;
 &lt;br /&gt;
 private:&lt;br /&gt;
 	T* p;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt; Handle&amp;amp;lt;T&amp;amp;gt;&amp;amp;amp; Handle&amp;amp;lt;T&amp;amp;gt;::operator=(const Handle&amp;amp;amp; rhs) {&lt;br /&gt;
 	if(&amp;amp;amp;rhs != this) {		// 자기 참조를 조사한뒤 행동방식을 결정한다.&lt;br /&gt;
 		delete p;&lt;br /&gt;
 		p = rhs.p ? rhs.p-&amp;amp;gt;clone() : 0;&lt;br /&gt;
 	}&lt;br /&gt;
 	return *this;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  Handle&amp;amp;lt;Core&amp;amp;gt; p(new Grad);	// Handle&amp;amp;lt;Core&amp;amp;gt; ==  Core*&lt;br /&gt;
 				// Handle&amp;amp;lt;Core&amp;amp;gt; 는 새로 생성된 Grad를 가리킨다.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt; T&amp;amp;amp; Handle&amp;amp;lt;T&amp;amp;gt;::operator*() const {&lt;br /&gt;
 	if(p)&lt;br /&gt;
 		return *p;&lt;br /&gt;
 	throw runtime_error(&amp;quot;unbound Handle&amp;quot;);&lt;br /&gt;
 }	// 최기화를 할때 생성한 객체를 가리키는 결과를 리턴한다.&lt;br /&gt;
 &lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt; T* Handle&amp;amp;lt;T&amp;amp;gt;::operator-&amp;amp;gt;() const {&lt;br /&gt;
 	if(p)&lt;br /&gt;
 		return p;&lt;br /&gt;
 	throw runtime_error(&amp;quot;unbound Handle&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 -&amp;gt; 연산자는 일견 이항 연산자 처럼 보이지만 동작하는 방식이 다른 연산자들과는 다르다. -&amp;gt;를 호출하게 되면 연산자의 좌측요소에서 포인터를 대신해서 사용이 가능한 요소가 리턴된다.&lt;br /&gt;
&lt;br /&gt;
 // 동일한 표현&lt;br /&gt;
 x-&amp;amp;gt;y;&lt;br /&gt;
 (x.operator-&amp;amp;gt;())-&amp;amp;gt;y;&lt;br /&gt;
 &lt;br /&gt;
 //as upper&lt;br /&gt;
 student-&amp;amp;gt;y;&lt;br /&gt;
 (student.operator-&amp;amp;gt;())-&amp;amp;gt;y;&lt;br /&gt;
 student.p-&amp;amp;gt;y;&lt;br /&gt;
  &lt;br /&gt;
 상기의 정의에서 *, -&amp;gt; 연산자를 참조형, 포인터형으로 리턴하게 함으로써 자동으로 파생객체에 대한 동적바인딩이 가능해 진다.&lt;br /&gt;
&lt;br /&gt;
 === 14.1.2 제네릭 핸들 사용하기 ===&lt;br /&gt;
 //main.cpp&lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;ios&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iomanip&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdexcept&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;Handle.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;Student_info.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 using std::cin;&lt;br /&gt;
 using std::cout;&lt;br /&gt;
 using std::domain_error;&lt;br /&gt;
 using std::endl;&lt;br /&gt;
 using std::sort;&lt;br /&gt;
 using std::streamsize;&lt;br /&gt;
 using std::setprecision;&lt;br /&gt;
 using std::setw;&lt;br /&gt;
 using std::string;&lt;br /&gt;
 using std::vector;&lt;br /&gt;
 &lt;br /&gt;
 using std::max;&lt;br /&gt;
 &lt;br /&gt;
 bool compare_Core_handles(const Handle&amp;amp;lt;Core&amp;amp;gt;&amp;amp;amp; lhs, const Handle&amp;amp;lt;Core&amp;amp;gt;&amp;amp;amp; rhs) {&lt;br /&gt;
 	return compare(*lhs, *rhs);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	vector&amp;amp;lt; Handle&amp;amp;lt;Core&amp;amp;gt; &amp;amp;gt; students;       // changed type&lt;br /&gt;
 	Handle&amp;amp;lt;Core&amp;amp;gt; record;                   // changed type&lt;br /&gt;
 	char ch;&lt;br /&gt;
 	string::size_type maxlen = 0;&lt;br /&gt;
 &lt;br /&gt;
 	// read and store the data&lt;br /&gt;
 	while (cin &amp;amp;gt;&amp;amp;gt; ch) {&lt;br /&gt;
 		if (ch == &amp;#039;U&amp;#039;)&lt;br /&gt;
 			record = new Core;      // allocate a `Core&amp;#039; object&lt;br /&gt;
 		else&lt;br /&gt;
 			record = new Grad;      // allocate a `Grad&amp;#039; object&lt;br /&gt;
 &lt;br /&gt;
 		record-&amp;amp;gt;read(cin);  //  `Handle&amp;amp;lt;T&amp;amp;gt;::-&amp;amp;gt;&amp;#039;, then `virtual&amp;#039; call to `read&amp;#039;&lt;br /&gt;
 		maxlen = max(maxlen, record-&amp;amp;gt;name().size()); // `Handle&amp;amp;lt;T&amp;amp;gt;::-&amp;amp;gt;&amp;#039;&lt;br /&gt;
 		students.push_back(record);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	// `compare&amp;#039; must be rewritten to work on `const Handle&amp;amp;lt;Core&amp;amp;gt;&amp;amp;amp;&amp;#039;&lt;br /&gt;
 	sort(students.begin(), students.end(), compare_Core_handles);&lt;br /&gt;
 &lt;br /&gt;
 	// write the names and grades&lt;br /&gt;
 	for (vector&amp;amp;lt; Handle&amp;amp;lt;Core&amp;amp;gt; &amp;amp;gt;::size_type i = 0;&lt;br /&gt;
 	     i != students.size(); ++i) {&lt;br /&gt;
 		// `students[i]&amp;#039; is a `Handle&amp;#039;, which we dereference to call the functions&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; students[i]-&amp;amp;gt;name()&lt;br /&gt;
 		     &amp;amp;lt;&amp;amp;lt; string(maxlen + 1 - students[i]-&amp;amp;gt;name().size(), &amp;#039; &amp;#039;);&lt;br /&gt;
 		try {&lt;br /&gt;
 			double final_grade = students[i]-&amp;amp;gt;grade();&lt;br /&gt;
 			streamsize prec = cout.precision();&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; setprecision(3) &amp;amp;lt;&amp;amp;lt; final_grade&lt;br /&gt;
 			     &amp;amp;lt;&amp;amp;lt; setprecision(prec) &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		} catch (domain_error e) {&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; e.what() &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		}&lt;br /&gt;
 		// no `delete&amp;#039; statement&lt;br /&gt;
 	}&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 Handle 클래스는 연결된 객체의 clone() 멤버함수를 이용한다. 따라서 Core클래스에 clone()메소드를 public으로 작성하는 것이 필요하다.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Handle&amp;lt;&amp;gt;을 이용한 Student_info 의 구현&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 //Student_info.h&lt;br /&gt;
 #ifndef GUARD_Student_info&lt;br /&gt;
 #define GUARD_Student_info&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;Core.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;Handle.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class Student_info {&lt;br /&gt;
 public:&lt;br /&gt;
 	Student_info() { }&lt;br /&gt;
 	Student_info(std::istream&amp;amp;amp; is) { read(is); }&lt;br /&gt;
 	// no copy, assign, or destructor: they&amp;#039;re no longer needed&lt;br /&gt;
 &lt;br /&gt;
 	std::istream&amp;amp;amp; read(std::istream&amp;amp;amp;);&lt;br /&gt;
 &lt;br /&gt;
 	std::string name() const {&lt;br /&gt;
 		if (cp) return cp-&amp;amp;gt;name();&lt;br /&gt;
 		else throw std::runtime_error(&amp;quot;uninitialized Student&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	double grade() const {&lt;br /&gt;
 		if (cp) return cp-&amp;amp;gt;grade();&lt;br /&gt;
 		else throw std::runtime_error(&amp;quot;uninitialized Student&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 	static bool compare(const Student_info&amp;amp;amp; s1,&lt;br /&gt;
 	                    const Student_info&amp;amp;amp; s2) {&lt;br /&gt;
 		return s1.name() &amp;amp;lt; s2.name();&lt;br /&gt;
 	}&lt;br /&gt;
 private:&lt;br /&gt;
 	Handle&amp;amp;lt;Core&amp;amp;gt; cp;	// Handle 클래스가 생성과 소멸을 자동화하기 때문에 복사 생성자, 대입 연산자, 소멸자가 필요 없다.&lt;br /&gt;
 };&lt;br /&gt;
 #endif&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Student_info::read 의 재정의&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 //Student_info.cpp&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;Student_info.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;Core.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 using std::istream;&lt;br /&gt;
 &lt;br /&gt;
 istream&amp;amp;amp; Student_info::read(istream&amp;amp;amp; is)&lt;br /&gt;
 {&lt;br /&gt;
 	char ch;&lt;br /&gt;
 	is &amp;amp;gt;&amp;amp;gt; ch;     // get record type&lt;br /&gt;
 &lt;br /&gt;
 	// allocate new object of the appropriate type&lt;br /&gt;
 	// use `Handle&amp;amp;lt;T&amp;amp;gt;(T*)&amp;#039; to build a `Handle&amp;amp;lt;Core&amp;amp;gt;&amp;#039; from the pointer to that object&lt;br /&gt;
 	// call `Handle&amp;amp;lt;T&amp;amp;gt;::operator=&amp;#039; to assign the `Handle&amp;amp;lt;Core&amp;amp;gt;&amp;#039; to the left-hand side&lt;br /&gt;
 	if (ch == &amp;#039;U&amp;#039;)&lt;br /&gt;
 		cp = new Core(is);&lt;br /&gt;
 	else&lt;br /&gt;
 		cp = new Grad(is);&lt;br /&gt;
 &lt;br /&gt;
 	return is;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 자동으로 객체의 메모리 관리가 되기 때문에 delete 구문을 제거함. Handle::operator=()에 내부 메모리의 해제 구문이 들어있기 때문에 불필요.&lt;br /&gt;
&lt;br /&gt;
== 14.2 Reference-counted handles ==&lt;br /&gt;
어떤 경우에 프로그래머는 Handle이 대상 객체를 복사하는 형태가 아니라 단지 가리키는 형태로만 사용되기를 바랄 수 있다. 즉 동일한 객체를 2개의 다른 Handle 이 가리킬 수 있다는 말이다.&lt;br /&gt;
이경우 대상객체의 해제는 객체를 가리키는 마지막 핸들이 소멸될때 행해져야한다. 이를 위해 &amp;#039;&amp;#039;&amp;#039;레퍼런스 카운트(reference count, 참조계수)&amp;#039;&amp;#039;&amp;#039;를 사용한다.&lt;br /&gt;
이를 위해서 우리는 이전의 클래스에 &amp;#039;&amp;#039;&amp;#039;카운터(counter, 계수기)&amp;#039;&amp;#039;&amp;#039;를 추가하고 객체의 생성, 복사, 소멸시 이 카운터를 적절하게 갱신한다.&lt;br /&gt;
 //Ref_handle.h&lt;br /&gt;
 #ifndef Ref_handle_h&lt;br /&gt;
 #define Ref_handle_h&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;cstddef&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdexcept&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt; class Ref_handle {&lt;br /&gt;
 public:&lt;br /&gt;
 	// manage reference count as well as pointer&lt;br /&gt;
 	Ref_handle(): p(0), refptr(new size_t(1)) { }&lt;br /&gt;
 	Ref_handle(T* t):  p(t), refptr(new size_t(1)) { }&lt;br /&gt;
 	Ref_handle(const Ref_handle&amp;amp;amp; h): p(h.p), refptr(h.refptr) {&lt;br /&gt;
 		++*refptr;&lt;br /&gt;
 	}	// 참조형으로 동작하는 Handle인경우. 카운터의 주소를 대상객체의 카운터의 주소로 초기화, 카운터를 증가시킨다.&lt;br /&gt;
 &lt;br /&gt;
 	Ref_handle&amp;amp;amp; operator=(const Ref_handle&amp;amp;amp;);&lt;br /&gt;
 	~Ref_handle();&lt;br /&gt;
 &lt;br /&gt;
 	// as before&lt;br /&gt;
 	operator bool() const { return p; }&lt;br /&gt;
 	T&amp;amp;amp; operator*() const {&lt;br /&gt;
 		if (p)&lt;br /&gt;
 			return *p;&lt;br /&gt;
 		throw std::runtime_error(&amp;quot;unbound Ref_handle&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 	T* operator-&amp;amp;gt;() const {&lt;br /&gt;
 		if (p)&lt;br /&gt;
 			return p;&lt;br /&gt;
 		throw std::runtime_error(&amp;quot;unbound Ref_handle&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 private:&lt;br /&gt;
 	T* p;&lt;br /&gt;
 	std::size_t* refptr;      // added&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
 Ref_handle&amp;amp;lt;T&amp;amp;gt;&amp;amp;amp; Ref_handle&amp;amp;lt;T&amp;amp;gt;::operator=(const Ref_handle&amp;amp;amp; rhs)&lt;br /&gt;
 {	// Ref_handle&amp;amp;amp;를 인자로갖는 생성자와 마찬가지로 operator= 도 인자로 받은 대상이 Ref_handle 인 경우 카운터를 하나 증가시킨다.&lt;br /&gt;
 	++*rhs.refptr;&lt;br /&gt;
 &lt;br /&gt;
 	// free the left-hand side, destroying pointers if appropriate&lt;br /&gt;
 	// 여기서 만약 자기 자신을 대입할 경우에는 객체의 참조의 카운터가 변화하지 않게된다.&lt;br /&gt;
 	if (--*refptr == 0) {&lt;br /&gt;
 		delete refptr;&lt;br /&gt;
 		delete p;&lt;br /&gt;
 	}	// 마지막 대상객체의 핸들이라면 현재 존재하는 대상 객체를 삭제&lt;br /&gt;
 &lt;br /&gt;
 	// copy in values from the right-hand side&lt;br /&gt;
 	refptr = rhs.refptr;&lt;br /&gt;
 	p = rhs.p;&lt;br /&gt;
 	return *this;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt; Ref_handle&amp;amp;lt;T&amp;amp;gt;::~Ref_handle()&lt;br /&gt;
 {&lt;br /&gt;
 	if (--*refptr == 0) {&lt;br /&gt;
 		delete refptr;&lt;br /&gt;
 		delete p;&lt;br /&gt;
 	}&lt;br /&gt;
 }	// 소멸되는 핸들이 대상객체를 가리키는 마지막 객체라면 메모리에서 해제&lt;br /&gt;
 	// refptr도 동적할당된 객체이므로 메모리에서 해제해주는 코드가 필요하다.&lt;br /&gt;
 &lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;문제점&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 //Ref_handle을 기반으로 작성된 Student_info 클래스의 사용시&lt;br /&gt;
 Student_info s1(cin);&lt;br /&gt;
 Student_info s2 = s1;	// s1의 값을 s2로 복사한다. 하지만 내부의 객체는 같은 객체를 가리킨다.&lt;br /&gt;
필요없는 복사는 일어나지 않지만 이 경우 프로그래머가 원치 않을 경우에도 동일한 객체를 가리키는 일이 발생한다.&lt;br /&gt;
&lt;br /&gt;
== 14.3 Handles that let you decide when to share data ==&lt;br /&gt;
 //ptr.h&lt;br /&gt;
 #ifndef GUARD_Ptr_h&lt;br /&gt;
 #define GUARD_Ptr_h&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;cstddef&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdexcept&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt; class Ptr {&lt;br /&gt;
 public:&lt;br /&gt;
 	// new member to copy the object conditionally when needed&lt;br /&gt;
 	void make_unique() {&lt;br /&gt;
 		if (*refptr != 1) {&lt;br /&gt;
 			--*refptr;&lt;br /&gt;
 			refptr = new size_t(1);&lt;br /&gt;
 			p = p? clone(p): 0;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	/*&lt;br /&gt;
 	이 함수는 프로그래머가 필요할때 현재 가리키는 내부객체와 &lt;br /&gt;
 	동일한 내용의 객체를 복사한 객체를 만들어준다.&lt;br /&gt;
 &lt;br /&gt;
 	대신에 가리키는 대상의 핸들이 1개인 경우에는 이런 복사를 행하지 않는다.&lt;br /&gt;
 	*/&lt;br /&gt;
 	// the rest of the class looks like `Ref_handle&amp;#039; except for its name&lt;br /&gt;
 	Ptr(): p(0), refptr(new size_t(1)) { }&lt;br /&gt;
 	Ptr(T* t): p(t), refptr(new size_t(1)) { }&lt;br /&gt;
 	Ptr(const Ptr&amp;amp;amp; h): p(h.p), refptr(h.refptr) { ++*refptr; }&lt;br /&gt;
 &lt;br /&gt;
 	Ptr&amp;amp;amp; operator=(const Ptr&amp;amp;amp;);    // implemented analogously to 14.2/261&lt;br /&gt;
 	~Ptr();                        // implemented analogously to 14.2/262&lt;br /&gt;
 	operator bool() const { return p; }&lt;br /&gt;
 	T&amp;amp;amp; operator*() const;          // implemented analogously to 14.2/261&lt;br /&gt;
 	T* operator-&amp;amp;gt;() const;         // implemented analogously to 14.2/261&lt;br /&gt;
 &lt;br /&gt;
 private:&lt;br /&gt;
 	T* p;&lt;br /&gt;
 	std::size_t* refptr;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt; T* clone(const T* tp)&lt;br /&gt;
 {&lt;br /&gt;
 	return tp-&amp;amp;gt;clone();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
 T&amp;amp;amp; Ptr&amp;amp;lt;T&amp;amp;gt;::operator*() const { if (p) return *p; throw std::runtime_error(&amp;quot;unbound Ptr&amp;quot;); }&lt;br /&gt;
 &lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
 T* Ptr&amp;amp;lt;T&amp;amp;gt;::operator-&amp;amp;gt;() const { if (p) return p; throw std::runtime_error(&amp;quot;unbound Ptr&amp;quot;); }&lt;br /&gt;
 &lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
 Ptr&amp;amp;lt;T&amp;amp;gt;&amp;amp;amp; Ptr&amp;amp;lt;T&amp;amp;gt;::operator=(const Ptr&amp;amp;amp; rhs)&lt;br /&gt;
 {&lt;br /&gt;
         ++*rhs.refptr;&lt;br /&gt;
         // \f2free the lhs, destroying pointers if appropriate\fP&lt;br /&gt;
         if (--*refptr == 0) {&lt;br /&gt;
                 delete refptr;&lt;br /&gt;
                 delete p;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         // \f2copy in values from the right-hand side\fP&lt;br /&gt;
         refptr = rhs.refptr;&lt;br /&gt;
         p = rhs.p;&lt;br /&gt;
         return *this;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt; Ptr&amp;amp;lt;T&amp;amp;gt;::~Ptr()&lt;br /&gt;
 {&lt;br /&gt;
         if (--*refptr == 0) {&lt;br /&gt;
                 delete refptr;&lt;br /&gt;
                 delete p;&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
이 구조를 이용해서 Student_info를 작성하는 경우 우리는 새로 이 클래스에 대해서 작성할 코드가 전혀없다.&lt;br /&gt;
왜냐하면 Student_info에 대해서 내부 객체를 변경하는 함수는 오직 read인데 우리의 경우에는 read 함수 호출시 기존의 내부 멤버를 소멸시키고, 다시 객체를 만들어서 할당하기 때문이다.&lt;br /&gt;
 Student_info s1;&lt;br /&gt;
 s1.read(cin);&lt;br /&gt;
 Student_info s2 = s1;&lt;br /&gt;
 s2.read(cin)&lt;br /&gt;
그런데 내부객체인 Ptr 핸들은 그 요소를 나타내는 핸들이 오직 1개일 경우가 아니면 대상의 메모리를 해제 하지 않기 때문에 아래와 같은 코드에서 s1, s2의 값의 변화가 상호 영향을 미치지 않는다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;호출 객체의 변화가 같은 요소를 가리키는 핸들들에게 영향을 주지않기를 바라는 regrade 함수&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 void Student_info::regrade(double final, double thesis) {&lt;br /&gt;
 	cp.make_unique();&lt;br /&gt;
 &lt;br /&gt;
 	if(cp)&lt;br /&gt;
 		cp-&amp;amp;gt;regrade(final, thesis);&lt;br /&gt;
 	else throw run_time_error(&amp;quot;regrade of unknown student&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== 14.4 An improvement on controllable handles ==&lt;br /&gt;
 //Str.h - 치기가 귀찮아서 그냥 복사함. -_-&lt;br /&gt;
 #ifndef GUARD_Str_h&lt;br /&gt;
 #define GUARD_Str_h&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;quot;Ptr.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;Vec.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 template&amp;amp;lt;&amp;amp;gt;&lt;br /&gt;
 Vec&amp;amp;lt;char&amp;amp;gt;* clone(const Vec&amp;amp;lt;char&amp;amp;gt;*);&lt;br /&gt;
 &lt;br /&gt;
 // does this version work?&lt;br /&gt;
 class Str {&lt;br /&gt;
 	friend std::istream&amp;amp;amp; operator&amp;amp;gt;&amp;amp;gt;(std::istream&amp;amp;amp;, Str&amp;amp;amp;);&lt;br /&gt;
 	friend std::istream&amp;amp;amp; getline(std::istream&amp;amp;amp;, Str&amp;amp;amp;);&lt;br /&gt;
 &lt;br /&gt;
 public:&lt;br /&gt;
 	Str&amp;amp;amp; operator+=(const Str&amp;amp;amp; s) {&lt;br /&gt;
 		data.make_unique();&lt;br /&gt;
 		std::copy(s.data-&amp;amp;gt;begin(), s.data-&amp;amp;gt;end(),&lt;br /&gt;
 		          std::back_inserter(*data));&lt;br /&gt;
 		return *this;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	// interface as before&lt;br /&gt;
 	typedef Vec&amp;amp;lt;char&amp;amp;gt;::size_type size_type;&lt;br /&gt;
 &lt;br /&gt;
 	// reimplement constructors to create `Ptr&amp;#039;s&lt;br /&gt;
 	Str(): data(new Vec&amp;amp;lt;char&amp;amp;gt;) { }&lt;br /&gt;
 	Str(const char* cp): data(new Vec&amp;amp;lt;char&amp;amp;gt;)  {&lt;br /&gt;
 		std::copy(cp, cp + std::strlen(cp),&lt;br /&gt;
 		          std::back_inserter(*data));&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	Str(size_type n, char c): data(new Vec&amp;amp;lt;char&amp;amp;gt;(n, c)) { }&lt;br /&gt;
 	template &amp;amp;lt;class In&amp;amp;gt; Str(In i, In j): data(new Vec&amp;amp;lt;char&amp;amp;gt;) {&lt;br /&gt;
 		std::copy(i, j, std::back_inserter(*data));&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	// call `make_unique&amp;#039; as necessary&lt;br /&gt;
 	char&amp;amp;amp; operator[](size_type i) {&lt;br /&gt;
 		data.make_unique();&lt;br /&gt;
 		return (*data)[i];&lt;br /&gt;
 	}&lt;br /&gt;
 	const char&amp;amp;amp; operator[](size_type i) const { return (*data)[i]; }&lt;br /&gt;
 	size_type size() const { return data-&amp;amp;gt;size(); }&lt;br /&gt;
 &lt;br /&gt;
 	typedef char* iterator;&lt;br /&gt;
 	typedef const char* const_iterator;&lt;br /&gt;
 &lt;br /&gt;
 	iterator begin() { return data-&amp;amp;gt;begin(); }&lt;br /&gt;
 	const_iterator begin() const { return data-&amp;amp;gt;begin(); }&lt;br /&gt;
 &lt;br /&gt;
 	iterator end() { return data-&amp;amp;gt;end(); }&lt;br /&gt;
 	const_iterator end() const { return data-&amp;amp;gt;end(); }&lt;br /&gt;
 &lt;br /&gt;
 private:&lt;br /&gt;
 	// store a `Ptr&amp;#039; to a `vector&amp;#039;&lt;br /&gt;
 	Ptr&amp;amp;lt; Vec&amp;amp;lt;char&amp;amp;gt; &amp;amp;gt; data;&lt;br /&gt;
 };&lt;br /&gt;
 // as implemented in 12.3.2/216 and 12.3.3/219 &lt;br /&gt;
 std::ostream&amp;amp;amp; operator&amp;amp;lt;&amp;amp;lt;(std::ostream&amp;amp;amp;, const Str&amp;amp;amp;);&lt;br /&gt;
 Str operator+(const Str&amp;amp;amp;, const Str&amp;amp;amp;);&lt;br /&gt;
 inline bool operator&amp;amp;lt;(const Str&amp;amp;amp; lhs, const Str&amp;amp;amp; rhs)&lt;br /&gt;
 {&lt;br /&gt;
         return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());&lt;br /&gt;
 }&lt;br /&gt;
 inline bool operator&amp;amp;gt;(const Str&amp;amp;amp; lhs, const Str&amp;amp;amp; rhs)&lt;br /&gt;
 {&lt;br /&gt;
         return std::lexicographical_compare(rhs.begin(), rhs.end(), lhs.begin(), lhs.end());&lt;br /&gt;
 }&lt;br /&gt;
 inline bool operator&amp;amp;lt;=(const Str&amp;amp;amp; lhs, const Str&amp;amp;amp; rhs)&lt;br /&gt;
 {&lt;br /&gt;
         return !std::lexicographical_compare(rhs.begin(), rhs.end(), lhs.begin(), lhs.end());&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 inline bool operator&amp;amp;gt;=(const Str&amp;amp;amp; lhs, const Str&amp;amp;amp; rhs)&lt;br /&gt;
 {&lt;br /&gt;
         return !std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 inline bool operator==(const Str&amp;amp;amp; lhs, const Str&amp;amp;amp; rhs)&lt;br /&gt;
 {&lt;br /&gt;
         return lhs.size() == rhs.size() &amp;amp;amp;&amp;amp;amp;&lt;br /&gt;
                 std::equal(lhs.begin(), lhs.end(), rhs.begin());&lt;br /&gt;
 }&lt;br /&gt;
 inline bool operator!=(const Str&amp;amp;amp; lhs, const Str&amp;amp;amp; rhs)&lt;br /&gt;
 {&lt;br /&gt;
         return !(lhs == rhs);&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
기본 인터페이스는 이전의 Str과 동일하지만 자료구조가 Ptr&amp;lt; Vec&amp;amp;lt;char&amp;amp;gt; &amp;gt; 형으로 정의되었기 때문에 전체적인 메소드의 세부 구현이 많이 변경되었다. 그리고 Ptr템플릿으로 자료구조를 다룸으로서 Str클래스가 동일한 객체를 가리킬 수 있는 기능을 제공한다.&lt;br /&gt;
&lt;br /&gt;
 === 14.4.1 제어할 수 없는 타입 복사하기 ===&lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt; void Ptr&amp;amp;lt;T&amp;amp;gt;::make_unique() {&lt;br /&gt;
 	if(*refptr != 1) {&lt;br /&gt;
 		--*refptr;&lt;br /&gt;
 		refptf = new size_t(1);&lt;br /&gt;
 		p = p? p-&amp;amp;gt;clone() : 0;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 이 구현을 위해서는 Vec::clone()가 정의되어 있어야하지만, 이 함수를 정의하게 될 경우 원래 Vec의 구현이 표준 함수 vector의 구현의 부분이라는 가정에서 위배되기 때문에 추가할 수는 없다.&lt;br /&gt;
 이를 해결하기 위해서 우리는 전역함수인 clone()를 만들어서 해결한다. &amp;#039;&amp;#039;(소프트웨어 공학에서는 한단계를 우회하면 모든 문제가 해결된다라는 말이 있는데 여기에 적용될 수 있다,)&amp;#039;&amp;#039;&lt;br /&gt;
 template&amp;amp;lt;class T&amp;amp;gt; void Ptr&amp;amp;lt;T&amp;amp;gt;::make_unique() {&lt;br /&gt;
 	if(*refptr != 1) {&lt;br /&gt;
 		--*refptr;&lt;br /&gt;
 		refptf = new size_t(1);&lt;br /&gt;
 		p = p? clone() : 0;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;::clone()의 구현&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template&amp;amp;lt;&amp;amp;gt; Vec&amp;amp;lt;char*&amp;amp;gt; clone(const Vec&amp;amp;lt;char&amp;amp;gt;* vp) {&lt;br /&gt;
 	return new Vec&amp;amp;lt;char&amp;amp;gt;(*vp);&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;템플릿의 구체화(template specialization)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template&amp;lt;&amp;gt;를 사용하면 특정 인자 타입에 대한 특정 템플릿 함수의 버전을 정의한다.&lt;br /&gt;
 이렇게 만들어진 함순느 만약 Vec&amp;amp;lt;char&amp;amp;gt;*가 인자로 오는 경우에는 이 것이 실행되고 다른 버전의 템플릿이 오는 경우에는 그 객체의 clone()버전을 실행하게 된다.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;이러한 사항을 요약하면 다음과 같다&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| * Ptr&amp;amp;lt;T&amp;amp;gt;::make_unique()를 사용하지 않는다면 T::clone은 불필요 &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Ptr&amp;amp;lt;T&amp;amp;gt;::make_unique를 사용한다면 T::clone가 있다면 T::clone을 사용할 것이다. &amp;amp;#91;&amp;amp;#91;HTML(&amp;amp;lt;BR/&amp;amp;gt;)&amp;amp;#93;&amp;amp;#93; * Ptr&amp;amp;lt;T&amp;amp;gt;::make_unique를 사용한다면 T::clone가 미정의되었다면 clone&amp;amp;lt;T&amp;amp;gt;를 정의해서 원하는 바를 얻을 수 있다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 === 14.4.2 언제 복사가 필요할까요? ===&lt;br /&gt;
 만약 const 객체를 통해서 operator[]를 통해서 접근한다면 객체의 내용을 바꾸는 것을 허용해서는 안된다.&lt;br /&gt;
 이럴경우 operator[] const를 통해서 리턴되는 값은 make_unique를 통해서 복사된 것을 리턴함으로서 원본 객체의 데이터의 변형을 방지하는 것이 가능하다.&lt;br /&gt;
----&lt;br /&gt;
[[AcceleratedC++]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>