summaryrefslogtreecommitdiffstats
path: root/code/cpppp.html
diff options
context:
space:
mode:
authorWe-unite <3205135446@qq.com>2025-01-07 12:36:05 +0800
committerWe-unite <3205135446@qq.com>2025-01-07 12:36:05 +0800
commit4d88ef666eee1b6f191f6e85b00acf8d5a2d1899 (patch)
tree68391846bae84f9546b0d089c012afc336a6e6bd /code/cpppp.html
parent11e64c5804b696f170b9d5d881befbabc4a4e85c (diff)
downloadmyweb-4d88ef666eee1b6f191f6e85b00acf8d5a2d1899.tar.gz
myweb-4d88ef666eee1b6f191f6e85b00acf8d5a2d1899.zip
highlight don't use auto-detect but given languagenew_highlightjs
In this commit, lot's of things is changed. Hope they all runs currectly. Now highlight.js is supporting more and more proguam languages, but the auto detection always go wrong, even for common languages like c, bash, python, makefile. Use Given Language ------------------ As you know, I always write markdown and convert to html by pandoc. In the old, "```cpp" in markdown will be deleted first to keep the embeded code clean and not highlighted, then I can use highlight.js. But this causes that html document doesn't know the language. This time, md2html.sh is changed: pandoc use "--no-highlight" argument to keep code clean, and it will output like this: ```html <pre class="cpp"><code>...</code></pre> ``` Although there may be other tags between `<code></code>`, it's clear that `<pre class="xxx"><code>` is nested tightly, except some space characters or \n. Then, sed deal with the whole doc(not line by line), replace `<pre class="xxx"><code>` with `<pre><code class="language-xxx">`. That's it! Math Formula ------------ Math formular is also a problem during convertion by pandoc. In the old it's dealed menually. Now pandoc use "--mathjax=none", then formula is no longer showed by pandoc, but only `<span class="math xxx">\( formula \)</span>`. And the math tool I used will deal with it. Mermaid picture ---------------- pandoc doesn't support convert mermaid in markdown to html picture. Let's have a warning!
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;