diff options
Diffstat (limited to 'code/cpppp.html')
-rw-r--r-- | code/cpppp.html | 87 |
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"> //当代码很长而追求风格的时候,这样操作。 |
27 | cout << "1234567" | 26 | cout << "1234567" |
28 | << "7654321" | 27 | << "7654321" |
29 | << endl;</code></pre> | 28 | << endl;</code></pre> |
@@ -34,7 +33,7 @@ cout << "1234567" | |||
34 | <ul> | 33 | <ul> |
35 | <li>数据输入/常数可以以十进制、十六进制、二进制书写。</li> | 34 | <li>数据输入/常数可以以十进制、十六进制、二进制书写。</li> |
36 | </ul> | 35 | </ul> |
37 | <pre><code>#include <iostream> | 36 | <pre><code class="language-cpp">#include <iostream> |
38 | using namespace std; | 37 | using namespace std; |
39 | 38 | ||
40 | int main() | 39 | int 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 <iostream> | 48 | <pre><code class="language-cpp">#include <iostream> |
50 | using namespace std; | 49 | using namespace std; |
51 | int main() | 50 | int 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 | *因此可用以清空*/ |
100 | cin.get(name , ArSize);// read first line | 99 | cin.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 <iostream> | 124 | <pre><code class="language-cpp">#include <iostream> |
126 | using namespace std; | 125 | using namespace std; |
127 | 126 | ||
128 | struct student | 127 | struct 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"> |
176 | struct good | 175 | struct 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 <array> | 239 | <pre><code class="language-cpp">#include <array> |
241 | using namespace std; | 240 | using namespace std; |
242 | 241 | ||
243 | int main() | 242 | int 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++<10) | 265 | while(i++<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<<*++pt<<*(++pt)<<endl; | 292 | cout<<*++pt<<*(++pt)<<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<iostream> | 300 | <pre><code class="language-cpp">#include<iostream> |
302 | using namespace std; | 301 | using namespace std; |
303 | int main() | 302 | int 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">//函数定义 |
441 | int sum_arr(int arr[], int n);//对数组中元素求和 | 440 | int 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>&a</kbd>虽然也是指向首地址,但大小是整块数组的大小。)因而第一个形参实际是<kbd>int* | 447 | 一样,将数组名视为指针,指向第一个元素地址,对应元素大小为单个元素大小,详前。(相比之下,<kbd>&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本身可以改成新地址 |
469 | int age=39; | 468 | int age=39; |
470 | const int* pt=&age; | 469 | const int* pt=&age; |
471 | int sage=80; | 470 | int sage=80; |
@@ -478,7 +477,7 @@ int* const finger=&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 | //等价于以下 |
483 | int aum(int arr[][4], int size); | 482 | int 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 <iostream> | 515 | <pre><code class="language-cpp">#include <iostream> |
517 | #include <string> | 516 | #include <string> |
518 | using namespace std; | 517 | using 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 <iostream> | 551 | <pre><code class="language-cpp">#include <iostream> |
553 | #include <string> | 552 | #include <string> |
554 | using namespace std; | 553 | using 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 <iostream> | 570 | <pre><code class="language-cpp">#include <iostream> |
572 | using namespace std; | 571 | using 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 <iostream> | 632 | <pre><code class="language-cpp">#include <iostream> |
634 | using namespace std; | 633 | using 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 <stdio.h> | 664 | <pre><code class="language-c">#include <stdio.h> |
666 | #define square(x) x*x | 665 | #define square(x) x*x |
667 | 666 | ||
668 | int main() | 667 | int main() |
@@ -674,14 +673,14 @@ int main() | |||
674 | printf("a = %lf\nb = %lf\nd = %lf\n", a, b, d); | 673 | printf("a = %lf\nb = %lf\nd = %lf\n", 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 <iostream> | 683 | <pre><code class="language-cpp">#include <iostream> |
685 | using namespace std; | 684 | using namespace std; |
686 | int main() | 685 | int 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 <iostream> | 712 | <pre><code class="language-cpp">#include <iostream> |
714 | using namespace std; | 713 | using namespace std; |
715 | 714 | ||
716 | const string &fuck(string &s1, const string &s2) | 715 | const string &fuck(string &s1, const string &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 <iostream> | 766 | #include <iostream> |
768 | using namespace std; | 767 | using namespace std; |
769 | int add(int a, int b = 1, int c = 2) | 768 | int 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 <iostream> | 783 | #include <iostream> |
785 | using namespace std; | 784 | using 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 <iostream> | 813 | #include <iostream> |
815 | using namespace std; | 814 | using 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<class T>//一个模板 | 842 | <pre><code class="language-cpp">template<class T>//一个模板 |
844 | void swap(T &a,T &b); | 843 | void swap(T &a,T &b); |
845 | 844 | ||
846 | template<class T>//另一个模板 | 845 | template<class T>//另一个模板 |
@@ -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">//调用函数 |
913 | may('B'); | 912 | may('B'); |
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;//执行写操作 |
945 | ifstream ifs;//执行读操作 | 944 | ifstream ifs;//执行读操作 |
946 | fstream file;//读写都可以</code></pre> | 945 | fstream 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 <iostream> | 999 | <pre><code class="language-cpp">#include <iostream> |
1001 | #include <string> | 1000 | #include <string> |
1002 | #include <fstream> | 1001 | #include <fstream> |
1003 | using namespace std; | 1002 | using 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>对象名 << 写入的内容;</code> 如需换行,在写入内容后加 endl 即可。例程如下:</p> | 1044 | <p>格式如下: <code>对象名 << 写入的内容;</code> 如需换行,在写入内容后加 endl 即可。例程如下:</p> |
1046 | <pre><code>#include <iostream> | 1045 | <pre><code class="language-cpp">#include <iostream> |
1047 | #include <string> | 1046 | #include <string> |
1048 | #include <fstream> | 1047 | #include <fstream> |
1049 | using namespace std; | 1048 | using 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& read(char* buffer, int len)</code> 参数解释:字符指针 buffer | 1071 | <p>利用流对象调用成员函数<code>read</code>。 函数原型:<code>istream& read(char* buffer, int len)</code> 参数解释:字符指针 buffer |
1073 | 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p> | 1072 | 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p> |
1074 | <pre><code>#include <iostream> | 1073 | <pre><code class="language-cpp">#include <iostream> |
1075 | #include <string> | 1074 | #include <string> |
1076 | #include <fstream> | 1075 | #include <fstream> |
1077 | using namespace std; | 1076 | using namespace std; |
@@ -1092,7 +1091,7 @@ int main() | |||
1092 | <h3 id="写入">写入</h3> | 1091 | <h3 id="写入">写入</h3> |
1093 | <p>使用流对象成员函数<code>write</code>。 函数原型:<code>ostream& write(const char* buffer, int len)</code> 参数解释:字符指针 | 1092 | <p>使用流对象成员函数<code>write</code>。 函数原型:<code>ostream& write(const char* buffer, int len)</code> 参数解释:字符指针 |
1094 | buffer 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p> | 1093 | buffer 指向内存中一段存储空间。len 是读写的字节数。 例程如下:</p> |
1095 | <pre><code>#include <iostream> | 1094 | <pre><code class="language-cpp">#include <iostream> |
1096 | #include <string> | 1095 | #include <string> |
1097 | #include <fstream> | 1096 | #include <fstream> |
1098 | using namespace std; | 1097 | using namespace std; |