summaryrefslogtreecommitdiffstats
path: root/code/cpppp.html
diff options
context:
space:
mode:
Diffstat (limited to 'code/cpppp.html')
-rw-r--r--code/cpppp.html87
1 files changed, 43 insertions, 44 deletions
diff --git a/code/cpppp.html b/code/cpppp.html
index 2bfb80e..4bb0502 100644
--- a/code/cpppp.html
+++ b/code/cpppp.html
@@ -7,23 +7,22 @@
7 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
8 <title>cpppp快速基础</title> 8 <title>cpppp快速基础</title>
9 <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> 9 <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css">
10 <script type="text/javascript" src="https://hl.qin-juan-ge-zhu.top/myset/myhighlight.js"></script>
11 <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script> 10 <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script>
12</head> 11</head>
13 12
14<body> 13<body>
15 <div class="pandoc"> 14 <div class="pandoc">
16 <div class="main"> 15 <div class="main">
17 <p class="title">C++ Primer Plus快速基础</p> 16 <header id="title-block-header">
17 <p class="title">C++ Primer Plus<br>快速基础</p>
18 </header>
18 <h1 id="第二章">第二章</h1> 19 <h1 id="第二章">第二章</h1>
19 <ul> 20 <ul>
20 <li>在 C++中,<span 21 <li>在 C++中,<code>main</code>函数括号中使用<code>void</code>关键字表明拒绝任何参数,而空括号表示对是否接受参数保持沉默。</li>
21 class="math inline"><em>m</em><em>a</em><em>i</em><em>n</em></span>函数括号中使用<code>void</code>关键字表明拒绝任何参数,而空括号表示对是否接受参数保持沉默。
22 </li>
23 <li>连续赋值将从右向左进行。</li> 22 <li>连续赋值将从右向左进行。</li>
24 <li>输出拼接长字符串可以如下书写:</li> 23 <li>输出拼接长字符串可以如下书写:</li>
25 </ul> 24 </ul>
26 <pre><code> //当代码很长而追求风格的时候,这样操作。 25 <pre><code class="language-cpp"> //当代码很长而追求风格的时候,这样操作。
27cout &lt;&lt; &quot;1234567&quot; 26cout &lt;&lt; &quot;1234567&quot;
28 &lt;&lt; &quot;7654321&quot; 27 &lt;&lt; &quot;7654321&quot;
29 &lt;&lt; endl;</code></pre> 28 &lt;&lt; endl;</code></pre>
@@ -34,7 +33,7 @@ cout &lt;&lt; &quot;1234567&quot;
34 <ul> 33 <ul>
35 <li>数据输入/常数可以以十进制、十六进制、二进制书写。</li> 34 <li>数据输入/常数可以以十进制、十六进制、二进制书写。</li>
36 </ul> 35 </ul>
37 <pre><code>#include &lt;iostream&gt; 36 <pre><code class="language-cpp">#include &lt;iostream&gt;
38using namespace std; 37using namespace std;
39 38
40int main() 39int main()
@@ -46,7 +45,7 @@ int main()
46 <ul> 45 <ul>
47 <li><code>cout</code>提供控制符以八进制、十进制与十六进制显示整数。</li> 46 <li><code>cout</code>提供控制符以八进制、十进制与十六进制显示整数。</li>
48 </ul> 47 </ul>
49 <pre><code>#include &lt;iostream&gt; 48 <pre><code class="language-cpp">#include &lt;iostream&gt;
50using namespace std; 49using namespace std;
51int main() 50int main()
52{ 51{
@@ -94,7 +93,7 @@ int main()
94 </li> 93 </li>
95 <li><kbd>get</kbd>与<kbd>getline</kbd>,二者使用方式基本相同,只是前者继承 cin 的特性,不会读取换行符后再从字符串中删除,而是把换行符留在输入队列中。</li> 94 <li><kbd>get</kbd>与<kbd>getline</kbd>,二者使用方式基本相同,只是前者继承 cin 的特性,不会读取换行符后再从字符串中删除,而是把换行符留在输入队列中。</li>
96 </ul> 95 </ul>
97 <pre><code>/*在没有任何参数的情况下 96 <pre><code class="language-cpp">/*在没有任何参数的情况下
98 *cin.get()会读取下一个字符,即使是换行符 97 *cin.get()会读取下一个字符,即使是换行符
99 *因此可用以清空*/ 98 *因此可用以清空*/
100cin.get(name , ArSize);// read first line 99cin.get(name , ArSize);// read first line
@@ -122,7 +121,7 @@ cin.get(dessert. Arsize ) ;// read second line
122 </ul> 121 </ul>
123 </li> 122 </li>
124 </ul> 123 </ul>
125 <pre><code>#include &lt;iostream&gt; 124 <pre><code class="language-cpp">#include &lt;iostream&gt;
126using namespace std; 125using namespace std;
127 126
128struct student 127struct student
@@ -160,7 +159,7 @@ int main()
160 </blockquote> 159 </blockquote>
161 <h2 id="共用体">共用体</h2> 160 <h2 id="共用体">共用体</h2>
162 <p>举例:一个小商品目录,一些商品 id 为字符串,另一些为数字:</p> 161 <p>举例:一个小商品目录,一些商品 id 为字符串,另一些为数字:</p>
163 <pre><code>union id 162 <pre><code class="language-cpp">union id
164{ 163{
165 long id_num; 164 long id_num;
166 char id_str[32]; 165 char id_str[32];
@@ -172,7 +171,7 @@ struct good
172 id id_val; 171 id id_val;
173};</code></pre> 172};</code></pre>
174 <p>同时,有匿名共用体:</p> 173 <p>同时,有匿名共用体:</p>
175 <pre><code> 174 <pre><code class="language-cpp">
176struct good 175struct good
177{ 176{
178 char brand[20]; 177 char brand[20];
@@ -237,7 +236,7 @@ struct good
237 </ul> 236 </ul>
238 </li> 237 </li>
239 </ul> 238 </ul>
240 <pre><code>#include &lt;array&gt; 239 <pre><code class="language-cpp">#include &lt;array&gt;
241using namespace std; 240using namespace std;
242 241
243int main() 242int main()
@@ -261,7 +260,7 @@ int main()
261 <li>写在前边,则变量先加/减,再使用</li> 260 <li>写在前边,则变量先加/减,再使用</li>
262 <li>避免使用不完整的表达式</li> 261 <li>避免使用不完整的表达式</li>
263 </ul> 262 </ul>
264 <pre><code> //完整的表达式 263 <pre><code class="language-cpp"> //完整的表达式
265 i=0 264 i=0
266 while(i++&lt;10) 265 while(i++&lt;10)
267 { 266 {
@@ -289,7 +288,7 @@ int main()
289 <h3 id="指针与递增递减">指针与递增递减</h3> 288 <h3 id="指针与递增递减">指针与递增递减</h3>
290 <p>递增递减作用不赘。</p> 289 <p>递增递减作用不赘。</p>
291 <p>前缀递增递减与解引用运算优先级相同,因而从内向外解释:</p> 290 <p>前缀递增递减与解引用运算优先级相同,因而从内向外解释:</p>
292 <pre><code> int a[2]={1,2},*pt=a; 291 <pre><code class="language-cpp"> int a[2]={1,2},*pt=a;
293 cout&lt;&lt;*++pt&lt;&lt;*(++pt)&lt;&lt;endl; 292 cout&lt;&lt;*++pt&lt;&lt;*(++pt)&lt;&lt;endl;
294 //输出结果,二者相等,即*++pt先执行递增,而后经过顺序点,再解引用,实际为a[1]=2</code></pre> 293 //输出结果,二者相等,即*++pt先执行递增,而后经过顺序点,再解引用,实际为a[1]=2</code></pre>
295 <p>后缀递增递减优先级高于解引用,因而*pt++结果与上亦同。</p> 294 <p>后缀递增递减优先级高于解引用,因而*pt++结果与上亦同。</p>
@@ -298,7 +297,7 @@ int main()
298 <blockquote> 297 <blockquote>
299 <p>普通赋值运算式的值为右值。</p> 298 <p>普通赋值运算式的值为右值。</p>
300 </blockquote> 299 </blockquote>
301 <pre><code>#include&lt;iostream&gt; 300 <pre><code class="language-cpp">#include&lt;iostream&gt;
302using namespace std; 301using namespace std;
303int main() 302int main()
304{ 303{
@@ -311,7 +310,7 @@ int main()
311}</code></pre> 310}</code></pre>
312 <h2 id="循环">循环</h2> 311 <h2 id="循环">循环</h2>
313 <p><kbd>for</kbd>循环与<kbd>while</kbd>循环的本质是相同的:</p> 312 <p><kbd>for</kbd>循环与<kbd>while</kbd>循环的本质是相同的:</p>
314 <pre><code>for(init-expression; test-expression; update-expression) 313 <pre><code class="language-cpp">for(init-expression; test-expression; update-expression)
315{ 314{
316 statements 315 statements
317} 316}
@@ -404,7 +403,7 @@ while (test-expression)
404 <h2 id="字符函数库">字符函数库</h2> 403 <h2 id="字符函数库">字符函数库</h2>
405 <p>cctype(C 语言中的 ctype.h)可以用来确定字符是否为大/小写字母、数字、标点等。其优点在于更简单、更通用(字母、数字之类在不同的编码方式之下不一定都像 ASCII 404 <p>cctype(C 语言中的 ctype.h)可以用来确定字符是否为大/小写字母、数字、标点等。其优点在于更简单、更通用(字母、数字之类在不同的编码方式之下不一定都像 ASCII
406 中一样的连续分布)。包含的函数如下:</p> 405 中一样的连续分布)。包含的函数如下:</p>
407 <pre><code>namespace std { 406 <pre><code class="language-cpp">namespace std {
408 int isalnum(int c); 407 int isalnum(int c);
409 int isalpha(int c); 408 int isalpha(int c);
410 int isblank(int c); 409 int isblank(int c);
@@ -425,7 +424,7 @@ while (test-expression)
425 <ul> 424 <ul>
426 <li>函数原型:说明函数名、形参类型/名称、返回值类型 425 <li>函数原型:说明函数名、形参类型/名称、返回值类型
427 <ul> 426 <ul>
428 <li>其实就是<span class="math inline"><em>m</em><em>a</em><em>i</em><em>n</em>()</span>之前的函数声明</li> 427 <li>其实就是<code>main()</code>之前的函数声明</li>
429 <li>函数原型中的函数特征标(参数列表)可以省略标识符(形参名称)而只是指出其类型</li> 428 <li>函数原型中的函数特征标(参数列表)可以省略标识符(形参名称)而只是指出其类型</li>
430 </ul> 429 </ul>
431 </li> 430 </li>
@@ -437,7 +436,7 @@ while (test-expression)
437 <li>函数定义:函数的本体实现</li> 436 <li>函数定义:函数的本体实现</li>
438 </ul> 437 </ul>
439 <h2 id="函数与数组">函数与数组</h2> 438 <h2 id="函数与数组">函数与数组</h2>
440 <pre><code>//函数定义 439 <pre><code class="language-cpp">//函数定义
441int sum_arr(int arr[], int n);//对数组中元素求和 440int sum_arr(int arr[], int n);//对数组中元素求和
442 441
443//函数调用 442//函数调用
@@ -447,7 +446,7 @@ int sum=sum_arr(a,10);</code></pre>
447 <p><strong>原因:</strong>C++与 C 446 <p><strong>原因:</strong>C++与 C
448 一样,将数组名视为指针,指向第一个元素地址,对应元素大小为单个元素大小,详前。(相比之下,<kbd>&amp;a</kbd>虽然也是指向首地址,但大小是整块数组的大小。)因而第一个形参实际是<kbd>int* 447 一样,将数组名视为指针,指向第一个元素地址,对应元素大小为单个元素大小,详前。(相比之下,<kbd>&amp;a</kbd>虽然也是指向首地址,但大小是整块数组的大小。)因而第一个形参实际是<kbd>int*
449 arr</kbd>,即定义应当为:</p> 448 arr</kbd>,即定义应当为:</p>
450 <pre><code>int sum_arr(int* arr, int n);</code></pre> 449 <pre><code class="language-cpp">int sum_arr(int* arr, int n);</code></pre>
451 <p>这证明两种形参声明同时正确。<strong>在 C++中,<kbd>int* arr</kbd>与<kbd>int 450 <p>这证明两种形参声明同时正确。<strong>在 C++中,<kbd>int* arr</kbd>与<kbd>int
452 arr[]</kbd>当且仅当出现在函数头或函数原型的时候,含义才相同</strong>。它们都意味着 arr 是一个<kbd>int*</kbd>。</p> 451 arr[]</kbd>当且仅当出现在函数头或函数原型的时候,含义才相同</strong>。它们都意味着 arr 是一个<kbd>int*</kbd>。</p>
453 <h2 id="使用数组区间的函数">使用数组区间的函数</h2> 452 <h2 id="使用数组区间的函数">使用数组区间的函数</h2>
@@ -457,7 +456,7 @@ int sum=sum_arr(a,10);</code></pre>
457 <h2 id="指针与-const">指针与 const</h2> 456 <h2 id="指针与-const">指针与 const</h2>
458 <h3 id="将-const-用于指针">将 const 用于指针</h3> 457 <h3 id="将-const-用于指针">将 const 用于指针</h3>
459 <ul> 458 <ul>
460 <li>指针指向<span class="math inline"><em>c</em><em>o</em><em>n</em><em>s</em><em>t</em></span>常量,防止修改</li> 459 <li>指针指向<code>const</code>常量,防止修改</li>
461 <li>传参将指针本身声明为常量,防止修改指针指向的位置,但可以修改内容</li> 460 <li>传参将指针本身声明为常量,防止修改指针指向的位置,但可以修改内容</li>
462 </ul> 461 </ul>
463 <p>优点:</p> 462 <p>优点:</p>
@@ -465,7 +464,7 @@ int sum=sum_arr(a,10);</code></pre>
465 <li>避免无意见修改数据导致错误</li> 464 <li>避免无意见修改数据导致错误</li>
466 <li><kbd>const</kbd>可使函数能处理 const 与非 const 实参,否则只能接收后者。</li> 465 <li><kbd>const</kbd>可使函数能处理 const 与非 const 实参,否则只能接收后者。</li>
467 </ul> 466 </ul>
468 <pre><code>//只能防止修改pt指向的值,但pt本身可以改成新地址 467 <pre><code class="language-cpp">//只能防止修改pt指向的值,但pt本身可以改成新地址
469int age=39; 468int age=39;
470const int* pt=&amp;age; 469const int* pt=&amp;age;
471int sage=80; 470int sage=80;
@@ -478,7 +477,7 @@ int* const finger=&amp;sloth;//指向int的const指针
478//前者如上例,不能修改内容,但能重新指向 477//前者如上例,不能修改内容,但能重新指向
479//后者则不能重新指向,但可以修改内容</code></pre> 478//后者则不能重新指向,但可以修改内容</code></pre>
480 <h2 id="二维数组作参数">二维数组作参数</h2> 479 <h2 id="二维数组作参数">二维数组作参数</h2>
481 <pre><code>int sum(int (*arr)[4], int size); 480 <pre><code class="language-cpp">int sum(int (*arr)[4], int size);
482//等价于以下 481//等价于以下
483int aum(int arr[][4], int size); 482int aum(int arr[][4], int size);
484 483
@@ -513,7 +512,7 @@ int sum(int *arr[4], int size);</code></pre>
513 <li>使用函数指针来调用函数</li> 512 <li>使用函数指针来调用函数</li>
514 </ul> 513 </ul>
515 <p>例程如下:</p> 514 <p>例程如下:</p>
516 <pre><code>#include &lt;iostream&gt; 515 <pre><code class="language-cpp">#include &lt;iostream&gt;
517#include &lt;string&gt; 516#include &lt;string&gt;
518using namespace std; 517using namespace std;
519 518
@@ -549,7 +548,7 @@ int main()
549 <p>我又要骂人了,这什么东西,类型声明这么复杂?不用了不用了,享受不来。</p> 548 <p>我又要骂人了,这什么东西,类型声明这么复杂?不用了不用了,享受不来。</p>
550 <p>没事,C++11 还有个特性叫<kbd>auto</kbd>,不是么?</p> 549 <p>没事,C++11 还有个特性叫<kbd>auto</kbd>,不是么?</p>
551 <p>上边的例程可以被改写成如下形式:</p> 550 <p>上边的例程可以被改写成如下形式:</p>
552 <pre><code>#include &lt;iostream&gt; 551 <pre><code class="language-cpp">#include &lt;iostream&gt;
553#include &lt;string&gt; 552#include &lt;string&gt;
554using namespace std; 553using namespace std;
555 554
@@ -568,7 +567,7 @@ int main()
568}</code></pre> 567}</code></pre>
569 <p><del>这自动推断类型,多是一件美逝了!</del>让我们一起说,<strong>谢谢<kbd>auto</kbd>!</strong></p> 568 <p><del>这自动推断类型,多是一件美逝了!</del>让我们一起说,<strong>谢谢<kbd>auto</kbd>!</strong></p>
570 <p>另外,如果有若干函数返回类型和特征标都相同,都需要调用的话,何不考虑一下函数指针数组呢?更进一步地,为什么不选择创建一个指向整个函数指针数组的指针呢?</p> 569 <p>另外,如果有若干函数返回类型和特征标都相同,都需要调用的话,何不考虑一下函数指针数组呢?更进一步地,为什么不选择创建一个指向整个函数指针数组的指针呢?</p>
571 <pre><code>#include &lt;iostream&gt; 570 <pre><code class="language-cpp">#include &lt;iostream&gt;
572using namespace std; 571using namespace std;
573 572
574// 没错,函数原型可以不写形参名称的 573// 没错,函数原型可以不写形参名称的
@@ -630,7 +629,7 @@ const double *f3(int i)
630 </ul> 629 </ul>
631 <p>程序员做出内联请求时,编译器不一定同意(p.s.到底是我写代码还是编译器写代码?气抖冷!),它可能认为函数过大或者注意到有递归(众所周知,内敛这个形式不能递归的),或者有些编译器没有启用或实现内联这一功能。 630 <p>程序员做出内联请求时,编译器不一定同意(p.s.到底是我写代码还是编译器写代码?气抖冷!),它可能认为函数过大或者注意到有递归(众所周知,内敛这个形式不能递归的),或者有些编译器没有启用或实现内联这一功能。
632 </p> 631 </p>
633 <pre><code>#include &lt;iostream&gt; 632 <pre><code class="language-cpp">#include &lt;iostream&gt;
634using namespace std; 633using namespace std;
635 634
636// 这是一个内联函数 635// 这是一个内联函数
@@ -662,7 +661,7 @@ int main()
662 <p>输出表明,内联函数与普通函数一样,按值传递参数,参数为表达式则传递表达式的值。</p> 661 <p>输出表明,内联函数与普通函数一样,按值传递参数,参数为表达式则传递表达式的值。</p>
663 <p>C 语言中也可以像这样,不写函数原型,直接以函数定义充当函数原型。</p> 662 <p>C 语言中也可以像这样,不写函数原型,直接以函数定义充当函数原型。</p>
664 <h2 id="内联的原始实现c-中的define">内联的原始实现:C 中的<kbd>#define</kbd></h2> 663 <h2 id="内联的原始实现c-中的define">内联的原始实现:C 中的<kbd>#define</kbd></h2>
665 <pre><code>#include &lt;stdio.h&gt; 664 <pre><code class="language-c">#include &lt;stdio.h&gt;
666#define square(x) x*x 665#define square(x) x*x
667 666
668int main() 667int main()
@@ -674,14 +673,14 @@ int main()
674 printf(&quot;a = %lf\nb = %lf\nd = %lf\n&quot;, a, b, d); 673 printf(&quot;a = %lf\nb = %lf\nd = %lf\n&quot;, a, b, d);
675 return 0; 674 return 0;
676}</code></pre> 675}</code></pre>
677 <p>这并不是通过传递参数实现,而是通过文本替换实现的——<span class="math inline"><em>x</em></span>是“参数”的符号标记。</p> 676 <p>这并不是通过传递参数实现,而是通过文本替换实现的——<code>x</code>是“参数”的符号标记。</p>
678 <p>上例只有<span class="math inline"><em>a</em></span>输出正确,可以用括号进行改进:</p> 677 <p>上例只有<code>a</code>输出正确,可以用括号进行改进:</p>
679 <pre><code>#define square(x) ((x) * (x))</code></pre> 678 <pre><code class="language-c">#define square(x) ((x) * (x))</code></pre>
680 <p>即使如此,后两者依然输出错误,即无法实现按值传递。所以,使用内联函数应当尽可能考虑使用 C++的内联,而不是 C 的宏。</p> 679 <p>即使如此,后两者依然输出错误,即无法实现按值传递。所以,使用内联函数应当尽可能考虑使用 C++的内联,而不是 C 的宏。</p>
681 <h2 id="引用变量">引用变量</h2> 680 <h2 id="引用变量">引用变量</h2>
682 <h3 id="引用变量是什么能吃吗">引用变量是什么?能吃吗?</h3> 681 <h3 id="引用变量是什么能吃吗">引用变量是什么?能吃吗?</h3>
683 <p>引用变量是已定义变量的一个别名。话不多说,上例程。</p> 682 <p>引用变量是已定义变量的一个别名。话不多说,上例程。</p>
684 <pre><code>#include &lt;iostream&gt; 683 <pre><code class="language-cpp">#include &lt;iostream&gt;
685using namespace std; 684using namespace std;
686int main() 685int main()
687{ 686{
@@ -710,7 +709,7 @@ Addr n is 0x7ffce76ff48c</code></pre>
710 一份送到调用函数里使,即使做出了更改也不会直接影响原函数里的值,除非用返回值将其返回。有时候一个函数本来有自己需要返回的东西,又想把这个量修改了,就不好办了(用<kbd>pair</kbd>或者结构体,多少有点麻烦,还要为此创建一个类型)。这时候就可以考虑引用变量。 709 一份送到调用函数里使,即使做出了更改也不会直接影响原函数里的值,除非用返回值将其返回。有时候一个函数本来有自己需要返回的东西,又想把这个量修改了,就不好办了(用<kbd>pair</kbd>或者结构体,多少有点麻烦,还要为此创建一个类型)。这时候就可以考虑引用变量。
711 </p> 710 </p>
712 <h3 id="c-风格字符串作-string-对象引用参数">C-风格字符串作 string 对象引用参数</h3> 711 <h3 id="c-风格字符串作-string-对象引用参数">C-风格字符串作 string 对象引用参数</h3>
713 <pre><code>#include &lt;iostream&gt; 712 <pre><code class="language-cpp">#include &lt;iostream&gt;
714using namespace std; 713using namespace std;
715 714
716const string &amp;fuck(string &amp;s1, const string &amp;s2) 715const string &amp;fuck(string &amp;s1, const string &amp;s2)
@@ -763,7 +762,7 @@ int main()
763 </ul> 762 </ul>
764 <h3 id="默认参数">默认参数</h3> 763 <h3 id="默认参数">默认参数</h3>
765 <p>默认参数指函数调用中省略实参时自动使用的实参值。</p> 764 <p>默认参数指函数调用中省略实参时自动使用的实参值。</p>
766 <pre><code>// 一个使用默认参数的例子 765 <pre><code class="language-cpp">// 一个使用默认参数的例子
767#include &lt;iostream&gt; 766#include &lt;iostream&gt;
768using namespace std; 767using namespace std;
769int add(int a, int b = 1, int c = 2) 768int add(int a, int b = 1, int c = 2)
@@ -780,7 +779,7 @@ int main()
780 <p><strong>对于带参数列表(有形参)的函数,必须从右向左添加默认值,即所有有默认值的形参必须在所有无默认值形参的右边。使用时,传递的实参被从左到右依次赋给形参,而不得跳过任何形参。</strong></p> 779 <p><strong>对于带参数列表(有形参)的函数,必须从右向左添加默认值,即所有有默认值的形参必须在所有无默认值形参的右边。使用时,传递的实参被从左到右依次赋给形参,而不得跳过任何形参。</strong></p>
781 <h3 id="函数重载">函数重载</h3> 780 <h3 id="函数重载">函数重载</h3>
782 <p>函数重载指可以有多个同名函数,它们<strong>以参数列表(形参,不包括返回值类型)为区别</strong>。C++使用上下文来确定要使用的重载函数版本。</p> 781 <p>函数重载指可以有多个同名函数,它们<strong>以参数列表(形参,不包括返回值类型)为区别</strong>。C++使用上下文来确定要使用的重载函数版本。</p>
783 <pre><code>//一个函数重载示例程序 782 <pre><code class="language-cpp">//一个函数重载示例程序
784#include &lt;iostream&gt; 783#include &lt;iostream&gt;
785using namespace std; 784using namespace std;
786 785
@@ -810,7 +809,7 @@ int main()
810 <blockquote> 809 <blockquote>
811 <p>少扯淡,一个代码就明白了</p> 810 <p>少扯淡,一个代码就明白了</p>
812 </blockquote> 811 </blockquote>
813 <pre><code>//一个使用函数模板的历次 812 <pre><code class="language-cpp">//一个使用函数模板的历次
814#include &lt;iostream&gt; 813#include &lt;iostream&gt;
815using namespace std; 814using namespace std;
816 815
@@ -840,7 +839,7 @@ int main()
840 <p>常见用法为<strong>将模板放在头文件中,在需要使用的地方包含头文件</strong>。</p> 839 <p>常见用法为<strong>将模板放在头文件中,在需要使用的地方包含头文件</strong>。</p>
841 <h3 id="模板重载">模板重载</h3> 840 <h3 id="模板重载">模板重载</h3>
842 <p>模板满足了对不同类型使用同一种算法函数的需求,但并非所有类型都是用完全相同的算法。为满足此种需求,可以像重载常规函数一样重载模板定义,仍然需要满足参数列表不同便是了。</p> 841 <p>模板满足了对不同类型使用同一种算法函数的需求,但并非所有类型都是用完全相同的算法。为满足此种需求,可以像重载常规函数一样重载模板定义,仍然需要满足参数列表不同便是了。</p>
843 <pre><code>template&lt;class T&gt;//一个模板 842 <pre><code class="language-cpp">template&lt;class T&gt;//一个模板
844void swap(T &amp;a,T &amp;b); 843void swap(T &amp;a,T &amp;b);
845 844
846template&lt;class T&gt;//另一个模板 845template&lt;class T&gt;//另一个模板
@@ -909,7 +908,7 @@ void swap(T* a,T* b,int n);</code></pre>
909 </tbody> 908 </tbody>
910 </table> 909 </table>
911 </blockquote> 910 </blockquote>
912 <pre><code>//调用函数 911 <pre><code class="language-cpp">//调用函数
913may(&#39;B&#39;); 912may(&#39;B&#39;);
914 913
915//所有同名 914//所有同名
@@ -941,7 +940,7 @@ void may(T *); // 7</code></pre>
941 <h2 id="头文件">头文件</h2> 940 <h2 id="头文件">头文件</h2>
942 <p>C++文件操作头文件 fstream,也就是“文件流”。</p> 941 <p>C++文件操作头文件 fstream,也就是“文件流”。</p>
943 <h2 id="对象声明">对象声明</h2> 942 <h2 id="对象声明">对象声明</h2>
944 <pre><code>ofstream ofs;//执行写操作 943 <pre><code class="language-cpp">ofstream ofs;//执行写操作
945ifstream ifs;//执行读操作 944ifstream ifs;//执行读操作
946fstream file;//读写都可以</code></pre> 945fstream file;//读写都可以</code></pre>
947 <h2 id="文件打开关闭">文件打开、关闭</h2> 946 <h2 id="文件打开关闭">文件打开、关闭</h2>
@@ -997,7 +996,7 @@ fstream file;//读写都可以</code></pre>
997 <h2 id="文本文件">文本文件</h2> 996 <h2 id="文本文件">文本文件</h2>
998 <h3 id="读取">读取</h3> 997 <h3 id="读取">读取</h3>
999 <p>五种方法。例程如下:</p> 998 <p>五种方法。例程如下:</p>
1000 <pre><code>#include &lt;iostream&gt; 999 <pre><code class="language-cpp">#include &lt;iostream&gt;
1001#include &lt;string&gt; 1000#include &lt;string&gt;
1002#include &lt;fstream&gt; 1001#include &lt;fstream&gt;
1003using namespace std; 1002using namespace std;
@@ -1043,7 +1042,7 @@ int main()
1043}</code></pre> 1042}</code></pre>
1044 <h3 id="文件写入">文件写入</h3> 1043 <h3 id="文件写入">文件写入</h3>
1045 <p>格式如下: <code>对象名 &lt;&lt; 写入的内容;</code> 如需换行,在写入内容后加 endl 即可。例程如下:</p> 1044 <p>格式如下: <code>对象名 &lt;&lt; 写入的内容;</code> 如需换行,在写入内容后加 endl 即可。例程如下:</p>
1046 <pre><code>#include &lt;iostream&gt; 1045 <pre><code class="language-cpp">#include &lt;iostream&gt;
1047#include &lt;string&gt; 1046#include &lt;string&gt;
1048#include &lt;fstream&gt; 1047#include &lt;fstream&gt;
1049using namespace std; 1048using namespace std;
@@ -1071,7 +1070,7 @@ int main()
1071 <h3 id="读取-1">读取</h3> 1070 <h3 id="读取-1">读取</h3>
1072 <p>利用流对象调用成员函数<code>read</code>。 函数原型:<code>istream&amp; read(char* buffer, int len)</code> 参数解释:字符指针 buffer 1071 <p>利用流对象调用成员函数<code>read</code>。 函数原型:<code>istream&amp; read(char* buffer, int len)</code> 参数解释:字符指针 buffer
1073 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p> 1072 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p>
1074 <pre><code>#include &lt;iostream&gt; 1073 <pre><code class="language-cpp">#include &lt;iostream&gt;
1075#include &lt;string&gt; 1074#include &lt;string&gt;
1076#include &lt;fstream&gt; 1075#include &lt;fstream&gt;
1077using namespace std; 1076using namespace std;
@@ -1092,7 +1091,7 @@ int main()
1092 <h3 id="写入">写入</h3> 1091 <h3 id="写入">写入</h3>
1093 <p>使用流对象成员函数<code>write</code>。 函数原型:<code>ostream&amp; write(const char* buffer, int len)</code> 参数解释:字符指针 1092 <p>使用流对象成员函数<code>write</code>。 函数原型:<code>ostream&amp; write(const char* buffer, int len)</code> 参数解释:字符指针
1094 buffer 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p> 1093 buffer 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p>
1095 <pre><code>#include &lt;iostream&gt; 1094 <pre><code class="language-cpp">#include &lt;iostream&gt;
1096#include &lt;string&gt; 1095#include &lt;string&gt;
1097#include &lt;fstream&gt; 1096#include &lt;fstream&gt;
1098using namespace std; 1097using namespace std;