|
63 | 63 | - 直接初始化和拷贝初始化(用赋值符号进行的初始化) |
64 | 64 | - 直接初始化的两种形式: |
65 | 65 |
|
66 | | - ``` |
| 66 | + ```c++ |
67 | 67 | string valuename("value"); |
68 | 68 | string valuename(n,‘c’); |
69 | 69 | ``` |
|
76 | 76 | - 函数s.empty()和s.size() |
77 | 77 | - 运用cctype头文件进行处理string对象中的字符 |
78 | 78 | - 基于范围的for |
79 | | - ``` |
| 79 | + ``` c++ |
80 | 80 | for (declaration: expression) |
81 | 81 | statement |
82 | 82 | ``` |
|
88 | 88 | - 使用vector有何优点? |
89 | 89 | - 定义和初始化方式 |
90 | 90 |
|
91 | | - ``` |
| 91 | + ```c++ |
92 | 92 | vector<T> v1; |
93 | 93 | vector<T> v2(v1); |
94 | 94 | vector<T> v2 = v1; |
|
107 | 107 | 4. 迭代器 |
108 | 108 | - 掌握迭代器的使用 |
109 | 109 |
|
110 | | - ``` |
| 110 | + ```c++ |
111 | 111 | atuo itBegin = v.begin(), itEnd = v.end(); |
112 | 112 | ``` |
113 | 113 | - begin成员返回第一个元素的迭代器 |
|
179 | 179 | - 掌握点运算符和箭头运算符 |
180 | 180 | - 各自左右值的区分 |
181 | 181 | 7. 条件运算符 |
| 182 | + |
182 | 183 | - 掌握并运用唯一的三元运算符——条件运算符( cond ? expr1 : expr2 ) |
183 | 184 | 8. 位运算符 |
184 | 185 | - 掌握移位运算符的原理和操作使用(区别于IO中的重载版本) |
|
187 | 188 | 9. sizeof运算符 |
188 | 189 | - 返回一个表达式或类型名字所占的字节数,结果是size_t类型 |
189 | 190 | - 对类型使用 |
190 | | - ``` |
| 191 | + ```c++ |
191 | 192 | sizeof (type) |
192 | 193 | ``` |
193 | 194 | - 对表达式使用 |
194 | | - ``` |
| 195 | + ```c++ |
195 | 196 | sizeof expr |
196 | 197 | Sales_data data, *p; |
197 | 198 |
|
|
222 | 223 | - 复合语句在编程中使用的普遍性(举例) |
223 | 224 | - 块不以分号作为结束。块本身由花括号决定始末。 |
224 | 225 | 2. 语句作用域 |
| 226 | + |
225 | 227 | - 熟悉在语句的不同位置出现的变量的作用域。(句内、句外,产生的影响) |
226 | 228 | 3. 条件语句 |
227 | 229 | - if语句 |
228 | 230 | - 基本模式 |
229 | | - ``` |
| 231 | + ```c++ |
230 | 232 | //if语句 |
231 | 233 | if (condition) |
232 | 234 | statement; |
|
258 | 260 | 4. 迭代语句 |
259 | 261 | - while语句 |
260 | 262 | - 基本模式 |
261 | | - ``` |
| 263 | + ```c++ |
262 | 264 | while (condition) |
263 | 265 | statement |
264 | 266 | ``` |
265 | 267 | - 要注意到定义在while条件部分和while循环体内的变量每次迭代都会经历从创建到销毁的过程 |
266 | 268 | - 传统for语句 |
267 | 269 | - 基本模式 |
268 | | - ``` |
| 270 | + ```c++ |
269 | 271 | for (initializer; condition; expression) |
270 | 272 | statement |
271 | 273 | ``` |
|
275 | 277 | - 熟悉for语句中各部分的变量作用域 |
276 | 278 | - 范围for语句 |
277 | 279 | - 基本模式 |
278 | | - ``` |
| 280 | + ```c++ |
279 | 281 | for (declaration: expression) |
280 | 282 | statement |
281 | 283 | ``` |
282 | 284 | - 掌握范围for的执行原理 |
283 | 285 | - do while语句 |
284 | 286 | - do while语句是唯一一个必须先无条件执行一次循环体的迭代语句。 |
285 | 287 | - 基本模式 |
286 | | - ``` |
| 288 | + ```c++ |
287 | 289 | do |
288 | 290 | statement |
289 | 291 | while (condition) |
|
302 | 304 | - goto的功能是从goto语句无条件跳转到同一函数的另一条语句。(不建议使用。) |
303 | 305 | - 了解goto的用法 |
304 | 306 | 6. TRY语句块和异常处理 |
| 307 | + |
305 | 308 | - 暂不要求掌握此部分 |
306 | 309 | ## 第6章 函数 |
307 | 310 | 1. 函数基础 |
|
317 | 320 | - 参数列表(形参列表) |
318 | 321 | - 函数体 |
319 | 322 | 注:区别函数的关键在于***函数名***和***参数列表*** |
320 | | - ``` |
| 323 | + ```c++ |
321 | 324 | #include <iostream> |
322 | 325 |
|
323 | 326 | int add(int, int); // function prototype, declare a function |
|
335 | 338 | { |
336 | 339 | return num1 + num2; |
337 | 340 | } |
338 | | - ``` |
| 341 | + ``` |
339 | 342 | - 调用函数 |
340 | 343 | 了解函数调用的过程机制 |
341 | 344 | - 函数如何调用? |
|
364 | 367 | - 当形参为指针类型时,进行值传递也是将实参指针的值拷贝给形参 |
365 | 368 |
|
366 | 369 | 理解这句话 |
| 370 | + |
367 | 371 | > 值传递过程中,函数对形参所有的操作不会影响实参,不改变实参的任何内容 |
368 | 372 | - 引用传递 |
369 | 373 | - 引用的操作实际上是作用的在引用所引的对象上 |
370 | 374 | - 引用传递允许函数改变一个或多个实参的内容 |
371 | 375 | - 普通引用只接受同类型的对象作为初始值 |
372 | 376 | - 常量引用可以用同类型对象、表达式、字面值初始化 |
373 | | - - 如果函数需要多个返回值,可以使用引用形参来返回额外信息 |
374 | | -
|
| 377 | + - 如果函数需要多个返回值,可以使用引用形参来返回额外信息 |
| 378 | + |
375 | 379 | 理解这两句话 |
376 | 380 | > 传递引用可以避免对象的拷贝,因此建议尽量使用引用传递 |
377 | 381 | > 如果不需要改变引用形参的值,最好使用常量引用,它能接受的实参类型比普通引用多 |
378 | 382 | - const形参和实参 |
379 | 383 | - 当形参中有顶层const时,允许传递常量对象和非常量对象 |
380 | 384 | 注意以下例子 |
381 | | - ``` |
| 385 | + ```c++ |
382 | 386 | void func(const int i) {/* func能够读取i,但无法写入i */} |
383 | 387 | void func(int i) {/* ... */} // 错误:重复定义了func |
384 | 388 | ``` |
|
387 | 391 | - 不支持拷贝 |
388 | 392 | - 数组名会被自动转化为指针(数组名 - 参考“数组”一章节) |
389 | 393 | - 数组形参的使用和调用 |
390 | | - ``` |
| 394 | + ```c++ |
391 | 395 | void print(const int*); |
392 | 396 | void print(const int[]); |
393 | 397 | void print(const int[10]); |
|
397 | 401 | - 了解数组形参并没有传递数组的大小 |
398 | 402 | - 掌握防止数组形参在函数体内越界的三种办法: |
399 | 403 | 1. 使用数组引用形参 |
400 | | - ``` |
| 404 | + ```c++ |
401 | 405 | void print(int (&arr)[10] ); |
402 | 406 | // &arr 必须用圆括号括起来提升优先级 |
403 | 407 | ``` |
404 | 408 | - 不过这种定义也限制了我们只能传递维度既定的数组 |
405 | 409 | 2. 使用标准库规范 |
| 410 | + |
406 | 411 | - 传递首元素和尾后元素的指针 |
407 | 412 | 3. 显式传递一个表示数组大小的形参 |
408 | 413 | - 了解传递多维数组中的细节 |
409 | | - ``` |
| 414 | + ```c++ |
410 | 415 | void print(int matrix[10][10], int rowSize); |
411 | 416 | // 数组会被自动转化为指针,上述函数原型等同于 |
412 | 417 | void print(int (*matrix)[10], int rowSize); |
413 | 418 | // 需要rowSize来指定二维数组的第一个维度大小 |
414 | 419 | ``` |
415 | 420 | - main函数的形参:处理命令行选项 |
| 421 | + |
416 | 422 | - 简单了解main函数的形参的功能 |
417 | 423 | - 含有可变兴产的函数 |
| 424 | + |
418 | 425 | - 简单了解如何传递不定量的参数 |
419 | 426 | 3. 返回类型和return语句 |
420 | 427 | - 了解return语句的功能 |
421 | 428 | - return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方 |
422 | 429 | - return语句有两种形式 |
423 | | - ``` |
| 430 | + ```c++ |
424 | 431 | return; // 无返回值 |
425 | 432 | return expression; // 有返回值 |
426 | 433 | ``` |
|
431 | 438 | - 有返回值return提供了函数执行的结果 |
432 | 439 | - 返回值类型必须和函数返回值类型一致(或能够进行隐式类型转换) |
433 | 440 | - 确保有返回值函数只能通过一条有效的return语句退出 |
| 441 | + |
434 | 442 | - 确保函数无论哪条路径都能有return退出 |
435 | 443 | - 了解函数返回值是如何返回的 |
436 | 444 | - 返回一个值的方式和初始化一个变量或形参的方式完全一样 |
437 | 445 | - 返回值用于初始化调用点的一个临时量,该临时量就是函数调用的结果 |
438 | 446 | - ***不要返回局部对象的引用或指针*** |
439 | | - ``` |
| 447 | + ```c++ |
440 | 448 | const string &manip() |
441 | 449 | { |
442 | 450 | string ret; |
|
452 | 460 | ``` |
453 | 461 | - 返回类 类型的函数和调用运算符 |
454 | 462 | - 如果函数返回指针、引用或者类的对象,可以直接在函数调用的结果访问结果对象的成员 |
455 | | - ``` |
| 463 | + ```c++ |
456 | 464 | const string shorterString(string, string); |
457 | 465 | ... |
458 | 466 | ... |
|
466 | 474 | - 如果函数返回的是引用类型的对象,可以直接对函数调用的结果进行赋值 |
467 | 475 | - 列表初始化返回值 |
468 | 476 | - 了解C++11中支持的“函数可以返回花括号包围的值的列表” |
469 | | - ``` |
| 477 | + ```c++ |
470 | 478 | vector<string> process() |
471 | 479 | { |
472 | 480 | return {"Hi", "bye"}; |
473 | 481 | } |
474 | 482 | ``` |
475 | 483 | - main函数的返回值 |
| 484 | + |
476 | 485 | - 简单了解mian函数返回值的意义 |
477 | 486 | - 理解并掌握如何使用递归函数 |
478 | 487 | - 返回数组指针 |
|
483 | 492 | 4. 函数重载 |
484 | 493 | - 掌握何为重载函数和如何进行函数的重载 |
485 | 494 | - 同一作用域内的几个函数名相同但形参列表不同的函数,称为**重载函数** |
486 | | - ``` |
| 495 | + ```c++ |
487 | 496 | // print函数的3个重载 |
488 | 497 | void print(const char *cp); |
489 | 498 | void print(const int *beg, const int *end); |
|
493 | 502 | - 类型别名不构成重载,顶层const不构成重载 |
494 | 503 | - 简单了解const_cast重载 |
495 | 504 | - 重载函数的调用 |
| 505 | + |
496 | 506 | - 掌握函数匹配的机制(见“函数匹配”) |
497 | 507 | 5. 特殊用途与语言特性 |
498 | 508 | 理解并掌握默认实参、内联函数和constexpr函数 |
|
503 | 513 | - 默认实参声明 |
504 | 514 | - 允许多次声明同一个函数,给不同的形参添加默认实参 |
505 | 515 | - 在给定的作用域中,一个形参只能被赋予一次默认实参 |
506 | | - ``` |
| 516 | + ```c++ |
507 | 517 | string screen( int width, int height, char title = ' ' ); |
508 | 518 | string screen( int width, int height, char title = '*' ); // 错误:一个形参只能被赋予一次默认实参 |
509 | 519 | string screen( int width = 24, int height = 80, char title ); // 正确:可以看到它并没有再次给title设置默认实参 |
510 | 520 | ``` |
511 | 521 | - 默认实参初始化 |
512 | | - ``` |
| 522 | + ```c++ |
513 | 523 | int wd = 80; |
514 | 524 | char def = ' '; |
515 | 525 | int ht(); |
|
541 | 551 | - 程序转向一个新的位置继续执行 |
542 | 552 | - 把函数声明为内联函数可以避免这一系列的开销 |
543 | 553 | > 函数声明前加上inline关键字将函数转换为内联函数 |
544 | | - >> 声明为内联函数后,在编译时将函数在每个调用点上“内联地”展开 |
545 | | - >>> 因为要展开,所以内容长的函数不适合内联 |
| 554 | + > > 声明为内联函数后,在编译时将函数在每个调用点上“内联地”展开 |
| 555 | + > > |
| 556 | + > > > 因为要展开,所以内容长的函数不适合内联 |
546 | 557 | - constexpr函数 |
547 | 558 | 了解什么是constexpr函数 |
548 | 559 | - 能用于常量表达式的函数 |
|
569 | 580 | 1. 每个实参的匹配都不劣于其他可行函数的匹配 |
570 | 581 | 2. 至少有一个实参的匹配优于其他可行函数的匹配 |
571 | 582 | 3. 满足条件的函数只能有一个 |
572 | | - ``` |
| 583 | + ```c++ |
573 | 584 | void f(); |
574 | 585 | void f(int); |
575 | 586 | void f(int, int); |
576 | 587 | void f(double, double=3.14); |
577 | 588 |
|
578 | | -
|
579 | 589 | f(1, 1.2); // 错误:二义性调用 |
580 | 590 | // 考虑第一个参数时f(int, int)胜出,考虑第二个参数时f(double, double)胜出,因此没有最佳匹配 |
581 | 591 | ``` |
|
604 | 614 | 函数指针有以下特殊: |
605 | 615 | 1. 函数名会自动地转换成指针,取地址符不是必须的 |
606 | 616 | 2. 可以直接使用指向函数的指针调用函数,解引用不是必须的 |
607 | | - ``` |
| 617 | + ```c++ |
608 | 618 | pf = lengthCompare; |
609 | 619 | pf = &lengthCompare; |
610 | 620 | ``` |
611 | 621 | - 调用函数指针 |
612 | | - ``` |
| 622 | + ```c++ |
613 | 623 | bool b1 = pf( "Hello", "goodbye" ); |
614 | 624 | bool b2 = (*pf)( "Hello", "goodbye" ); |
615 | 625 | bool b3 = lengthCompare( "Hello", "goodbye" ); |
616 | 626 | ``` |
617 | 627 | - 函数指针形参 |
618 | | - ``` |
| 628 | + ```c++ |
619 | 629 | void useBegger( const string &s1, const string &s2, bool pf( const string &, const string & )); |
620 | 630 |
|
621 | 631 | void useBegger( const string &s1, const string &s2, bool (*pf)( const string&, const string& )); |
622 | 632 | ``` |
623 | 633 | 上面两个函数都是合法的 |
| 634 | + |
624 | 635 | > 我们在使用函数指针作形参时, 可以显示的将形参定义成指向函数的指针, 也可以直接使用函数类型,会自动转换为函数指针 |
625 | 636 | ## 第7章 类 |
626 | 637 | 1. 定义抽象数据类型 |
|
0 commit comments