北京大学:C++程序设计 课堂笔记

介绍

北京大学程序设计与算法系列之C++程序设计,视频:Coursera、哔哩哔哩。

说明

本课堂笔记目的是方便自己和大家复习以及查阅使用,所以课件内容偏多,请见谅。如有修改意见,欢迎大家提出。

程序设计与算法:C++程序设计

  • 介绍
  • 说明
  • C++程序设计
    • P3 01 :函数指针
    • P4 02 命令行参数
    • P5 03 位运算
      • `&`:按位与运算
      • `|`:按位或运算
      • `^`:按位异或运算
      • `~`:按位非运算
      • `<<`:按位左移运算
      • `>>`:按位右移运算
    • P6 04 引用
    • P7 05 const 关键字和常量
    • P8 06 动态内存分配
    • P9 07 内联函数和重载函数
    • P10 08 函数缺省参数
    • P11 09 面向对象程序设计
    • P12 10 面向对象语言发展历程
    • P13 11 从客观事物抽象出类的例子
    • P14 12 类成员的可访问范围
    • P15 01 内联成员函数和重载成员函数
    • P16 02 构造函数(constructor)
    • P17 03 复制构造函数
    • P18 04 类型转换构造函数
    • P19 05 析构函数
    • P20 06 静态成员变量和静态成员函数
    • P21 07 成员对象和封闭类
    • P22 08 友元(Friend)
    • P23 09 this指针
    • P24 10 常量对象,常量成员函数和常引用
    • P25 01 运算符重载
    • P26 02 赋值运算符重载(浅拷贝与深拷贝)
    • P27 03 运算符重载为友元函数
    • P28 04 运算符重载实例:长度可变的整型数组类
    • P29 05 流插入运算符和流提取运算符的重载
    • P30 06 自增自减运算符的重载
    • P31 01 继承和派生
    • P32 02 复合关系和继承关系
    • P33 03 基类派生类同名成员和`Protected`关键字
    • P34 04 派生类的构造函数
    • P35 05 public继承的赋值兼容规则
    • P36 01 多态和虚函数
    • P37 02 使用多态的游戏程序实例
    • P38 03更多多态程序实例
    • P39 04 多态实现原理
    • P40 虚析构函数
    • P41 纯虚函数和抽象类
    • P42 文件操作
    • P43 函数模板
    • P44 类模板
    • P45 string类
    • P46 输入输出
    • P47 STL 标准模板库
    • P49 顺序容器vector
    • P50 List和Deque
    • P51 函数对象
    • P52 set 和 multiset
    • P53 map和multimap
    • P54 容器适配器
    • P55

C++程序设计

P3 01 :函数指针

  1. 定义: 类型名( 指针变量名)(参数类型1, 参数类型2, …)*
    例如:int (*pf)(int, char)
  2. 使用:函数指针名(实参表)
    例如:pf = PrintMin; pf(x, y);
  3. 应用:C快速排序任意类型数组:qsort库函数
    void qsort(void *base, int nelem, unsigned int width, int(* pfCompare)(const void *, const void *)
    函数需要以下四个参数:
    1. 数组的起始地址:base
    2. 数组元素个数:nelem
    3. 数组元素大小:width
    4. 排序前后规则:int(* pfCompare)(a, b)
      其中,返回值包含以下三种情况:
      • 负整数:a在前,b在后;
      • 0:哪个参数在前都可以;
      • 正整数:a在后, b在前。
#include 
#include 

int MyCompare(const void * elem1, const void * elem2) {
    unsigned int * p1, * p2;
    p1 = (unsigned int *) elem1;    // "* elem1" 非法
    p2 = (unsigned int *) elem2;    // "* elem2" 非法
    return (*p1 % 10) - (*p2 % 10)
}
#define NUM 5
int main() {
    unsigned int an[NUM] = {8, 123, 11, 10, 4};
    qsort(an, NUM, sizeof(unsigned int), MyCompare);
    for(int i = 0; i < NUM; i++) {
        printf("%d", an[i])     // output: 10 11 123 4 8
    }
    return 0;
}

P4 02 命令行参数

命令行程序示例:

> notepad sample.txt
> copy file1.txt file2.txt

实现方式:

int main(int argc, char * argv[])
{
	...
}

其中,argc:命令行参数的个数。由于可执行程序本身的文件名也计算在内,故argc大于等于1。而argv[]是一个指针数组,argv[0]:可执行文件名;argv[1]:第2个命令行参数;以此类推。
注:某一命令行参数如果有空格,可用双引号括起。

  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第1张图片

P5 03 位运算

位运算符包括:

  1. &:按位与
  2. |:按位或
  3. ^:按位异或
  4. :按位非(取反)
  5. <<:按位左移
  6. >>:按位右移

&:按位与运算

用途:

  1. 变量中的某位置清0,且同时保留其他位不变。
    例如:int型变量n,使其低8位置0,其他位不变:
    n = n & 0xffffff00;
    或者:n &= 0xffffff00;
    nshort型(16位),则n &= 0xff00
  2. 获取变量中的某一位。
    例如:判断n第7位是否为1(从右往左,从0开始):
    判断n & 0x80是否等于0x80,因为0x80 == 1000 0000

|:按位或运算

用途:

  1. 变量中的某位置置1,且同时保留其他位不变。
    例如:int型变量n,使其低8位置1,其他位不变:
    n |= 0xff;

^:按位异或运算

用途:

  1. 变量中的某位置取反,且同时保留其他位不变。
    例如:int型变量n,使其低8位取反,其他位不变:
    n ^= 0xff;
    特点:由a ^ b = c可得:c ^ b = a以及c ^ a = b
    因此按位异或运算可用作简单的加密和解密。
  2. 不通过临时变量,交换两个变量的值。
int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;

~:按位非运算

用途:pass.

<<:按位左移运算

含义:a << b:将a按位左移b位。
性质:高位丢弃,低位补0;a的值不会因此改变。
左移n位,相当于乘以2n。但是左移运算比乘法运算快得多。

>>:按位右移运算

含义:a >> b:将a按位右移b位。
性质:低位丢弃,高位补0;a的值不会因此改变。

有符号数,如long, int, short, char 类型,符号位(最高位)一起移动。大多数编译器规定,如果原符号位为1,则右移时高位就补充1;原符号位为0,则右移时高位就补充0。

右移n位,相当于除以2n,并将结果往小里取整。例如

-25 >> 4 = -2
-2 >> 4 = -1
18 >> 4 = 1

注:负数转化成二进制:以补码形式表示,即先按正数转换,然后取反加1。

  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第2张图片北京大学:C++程序设计 课堂笔记_第3张图片北京大学:C++程序设计 课堂笔记_第4张图片北京大学:C++程序设计 课堂笔记_第5张图片

P6 04 引用

形式:类型名 & 引用名 = 某个变量名
例如:

int n = 4;
int & r = n;   // r 引用了 n, r 类型是 int &

含义:某个变量的引用,等价于这个变量,相当该变量的一个别名。

  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第6张图片北京大学:C++程序设计 课堂笔记_第7张图片北京大学:C++程序设计 课堂笔记_第8张图片北京大学:C++程序设计 课堂笔记_第9张图片北京大学:C++程序设计 课堂笔记_第10张图片北京大学:C++程序设计 课堂笔记_第11张图片北京大学:C++程序设计 课堂笔记_第12张图片北京大学:C++程序设计 课堂笔记_第13张图片北京大学:C++程序设计 课堂笔记_第14张图片北京大学:C++程序设计 课堂笔记_第15张图片

P7 05 const 关键字和常量

  • 要点:
    1. 避免使用define, 因为const有类型方便检查。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第16张图片北京大学:C++程序设计 课堂笔记_第17张图片
      北京大学:C++程序设计 课堂笔记_第18张图片北京大学:C++程序设计 课堂笔记_第19张图片错误1:不可通过常量指针修改其指向的内容;错误2:strcpy()的第一个参数类型为char *,而pconst char *,不能将const char *类型的指针赋给char *类型。
      北京大学:C++程序设计 课堂笔记_第20张图片

P8 06 动态内存分配

  • 要点:
    1. C语言:通过malloc分配内存。C++:new关键字实现动态分配内存。
    2. 分配变量:P = new T;,其中T为任意类型名。
    3. 分配数组:P = new T[N];
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第21张图片北京大学:C++程序设计 课堂笔记_第22张图片北京大学:C++程序设计 课堂笔记_第23张图片北京大学:C++程序设计 课堂笔记_第24张图片北京大学:C++程序设计 课堂笔记_第25张图片北京大学:C++程序设计 课堂笔记_第26张图片

P9 07 内联函数和重载函数

内联函数:不用栈调用,直接贴到主程序。
优点:加快程序运行。
缺点:导致可执行程序体积过大。

重载函数:名字相同,参数表不同。

  • 课件
    • 如下:北京大学:C++程序设计 课堂笔记_第27张图片北京大学:C++程序设计 课堂笔记_第28张图片北京大学:C++程序设计 课堂笔记_第29张图片北京大学:C++程序设计 课堂笔记_第30张图片北京大学:C++程序设计 课堂笔记_第31张图片

P10 08 函数缺省参数

  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第32张图片
      北京大学:C++程序设计 课堂笔记_第33张图片

P11 09 面向对象程序设计

  • 结构化程序设计的弊端
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第34张图片北京大学:C++程序设计 课堂笔记_第35张图片北京大学:C++程序设计 课堂笔记_第36张图片
      北京大学:C++程序设计 课堂笔记_第37张图片
    • 面向对象程序设计
      含义:,相当于模板
      北京大学:C++程序设计 课堂笔记_第38张图片北京大学:C++程序设计 课堂笔记_第39张图片北京大学:C++程序设计 课堂笔记_第40张图片北京大学:C++程序设计 课堂笔记_第41张图片北京大学:C++程序设计 课堂笔记_第42张图片北京大学:C++程序设计 课堂笔记_第43张图片

P12 10 面向对象语言发展历程

  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第44张图片北京大学:C++程序设计 课堂笔记_第45张图片

P13 11 从客观事物抽象出类的例子

  • 实例化对象
  • 类成员的访问:
  1. 对象名.成员名
  2. 指针->成员名
  3. 引用名.成员名
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第46张图片北京大学:C++程序设计 课堂笔记_第47张图片北京大学:C++程序设计 课堂笔记_第48张图片实例化过程:
      北京大学:C++程序设计 课堂笔记_第49张图片北京大学:C++程序设计 课堂笔记_第50张图片北京大学:C++程序设计 课堂笔记_第51张图片
      北京大学:C++程序设计 课堂笔记_第52张图片北京大学:C++程序设计 课堂笔记_第53张图片北京大学:C++程序设计 课堂笔记_第54张图片北京大学:C++程序设计 课堂笔记_第55张图片注:函数形参里的 &r 去掉不影响结果输出,但效率低。
      北京大学:C++程序设计 课堂笔记_第56张图片
      北京大学:C++程序设计 课堂笔记_第57张图片

P14 12 类成员的可访问范围

  • 要点:

    1. 缺省类型的成员为私有成员,即未明确可访问类型的变量。
    2. 类的公有成员函数内部的私有变量是可以访问到的。
    3. 类的私有成员变量只能由类的成员函数访问。原因之一:方便修改。
  • 课件

    • 如下:
      北京大学:C++程序设计 课堂笔记_第58张图片北京大学:C++程序设计 课堂笔记_第59张图片北京大学:C++程序设计 课堂笔记_第60张图片
      北京大学:C++程序设计 课堂笔记_第61张图片北京大学:C++程序设计 课堂笔记_第62张图片北京大学:C++程序设计 课堂笔记_第63张图片北京大学:C++程序设计 课堂笔记_第64张图片

P15 01 内联成员函数和重载成员函数

  • 要点:

    1. 内联函数的设计目的:单独一个函数语句少的情况下,反复调用,开销大。
    2. 参数缺省的目的:提高程序的可扩展性。添加新的函数时,不需要的参数可直接用默认值。
  • 课件

    • 如下:
      北京大学:C++程序设计 课堂笔记_第65张图片北京大学:C++程序设计 课堂笔记_第66张图片北京大学:C++程序设计 课堂笔记_第67张图片北京大学:C++程序设计 课堂笔记_第68张图片

P16 02 构造函数(constructor)

  • 要点:

    1. 构造函数的目的:对象初始化
    2. 它不分配存储空间,而是在已经分配空间之后做初始化的工作。例如:盖房子,房子是一个对象,构造函数仅仅是在房子盖好之后进行装修。
    3. 对象生成时一定会调用构造函数。
    4. 对象一定要初始化在使用。
  • 课件:

    • 如下
      北京大学:C++程序设计 课堂笔记_第69张图片北京大学:C++程序设计 课堂笔记_第70张图片北京大学:C++程序设计 课堂笔记_第71张图片北京大学:C++程序设计 课堂笔记_第72张图片北京大学:C++程序设计 课堂笔记_第73张图片北京大学:C++程序设计 课堂笔记_第74张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第75张图片北京大学:C++程序设计 课堂笔记_第76张图片北京大学:C++程序设计 课堂笔记_第77张图片注:pArray[3]是 指针数组,不是对象数组,它的每一个元素都是指针,可以不初始化,因此,它不会引发对象生成。指针只表示指示作用,所以不会导致指示的对象生成构造函数。此时,对前两个指针初始化,new的返回值类型为Test *

P17 03 复制构造函数

  • 要点:

    1. 把某一对象C1的成员变量复制到另一对象C2,即复制品
    2. 复制构造函数被调用的三种方式:
      1. 一个对象去初始化另一个对象;
      2. 函数参数是类A的对象
      3. 函数返回值是类A的对象
  • 课件

    • 如下:
      北京大学:C++程序设计 课堂笔记_第78张图片北京大学:C++程序设计 课堂笔记_第79张图片北京大学:C++程序设计 课堂笔记_第80张图片北京大学:C++程序设计 课堂笔记_第81张图片注:C++的标准不允许复制构造函数传值参数,否则会编译出错。因为是传值参数,我们把形参复制到实参会调用复制构造函数。如果允许复制构造函数传值,就会在复制构造函数内调用复制构造函数,就会形成永无休止的递归调用从而导致栈溢出。(来自:剑指offer)
      北京大学:C++程序设计 课堂笔记_第82张图片北京大学:C++程序设计 课堂笔记_第83张图片
      北京大学:C++程序设计 课堂笔记_第84张图片注:复制构造函数的作用:复制一个对象的成员变量给另一对象。
    void Func(Complex1 a1){}		//	会调用复制构造函数,如同值传递
    void Func(Complex1 & a1){}		//	对象引用,不会调用复制构造函数,如同地址传递
    void Func(const Complex1 a1){}	//	会调用复制构造函数,不允许修改。
    void Func(const Complex1 & a1){}//	常对象引用,不会调用复制构造函数,不允许修改,如同地址传递
    

    博客C++构造函数详解(复制构造函数)是这么说的:复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中。 北京大学:C++程序设计 课堂笔记_第85张图片北京大学:C++程序设计 课堂笔记_第86张图片注:(来自B站评论)不管是返回一个类对象还是传入类对象作为参数,这个类对象不再是类对象,而是调用了以这个类对象作为参数的复制构造函数。即非引用类型的对象作为形参或是函数返回值时,在调用函数过程都会初始化同类型的对象,因此都会调用复制构造函数。
    北京大学:C++程序设计 课堂笔记_第87张图片

P18 04 类型转换构造函数

  • 要点:
    1. 适用于解决两边类型不一致的情况。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第88张图片北京大学:C++程序设计 课堂笔记_第89张图片注:Complex c2 = 9;中的等号=代表初始化,并非赋值。在调用类型转换构造函数时不会生成临时对象。而c1 = 9;为赋值语句,等号两端为不同类型,相当于以9作为实参调用类型转换构造函数Complex (int i),生成一个临时Complex对象赋值给c1

P19 05 析构函数

  • 要点:
    1. 在对象销毁时调用,与构造函数相对应。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第90张图片北京大学:C++程序设计 课堂笔记_第91张图片北京大学:C++程序设计 课堂笔记_第92张图片北京大学:C++程序设计 课堂笔记_第93张图片北京大学:C++程序设计 课堂笔记_第94张图片北京大学:C++程序设计 课堂笔记_第95张图片北京大学:C++程序设计 课堂笔记_第96张图片
      注:构造函数和析构函数的调用时机
    1. d4 = 6;:调用类型转换构造函数,生成临时对象。
    2. {}:代表作用域,相当于生命周期。
    3. 静态变量在整个函数结束时消亡。
    4. 析构函数释放顺序:局部变量->静态变量->全局变量
      北京大学:C++程序设计 课堂笔记_第97张图片

P20 06 静态成员变量和静态成员函数

  • 要点:
    1. 静态成员变量和函数,相当于该类全局变量和函数。
    2. 静态成员函数中不能包含非静态变量和函数。
    3. 静态成员,实际上不放在成员内部,而是放在所有成员的外面,被所有对象共享。即静态成员只与该类相关,与其他变量和成员基本上没有关系。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第98张图片北京大学:C++程序设计 课堂笔记_第99张图片北京大学:C++程序设计 课堂笔记_第100张图片北京大学:C++程序设计 课堂笔记_第101张图片北京大学:C++程序设计 课堂笔记_第102张图片北京大学:C++程序设计 课堂笔记_第103张图片北京大学:C++程序设计 课堂笔记_第104张图片北京大学:C++程序设计 课堂笔记_第105张图片北京大学:C++程序设计 课堂笔记_第106张图片北京大学:C++程序设计 课堂笔记_第107张图片北京大学:C++程序设计 课堂笔记_第108张图片北京大学:C++程序设计 课堂笔记_第109张图片北京大学:C++程序设计 课堂笔记_第110张图片注:复制构造函数,与所有构造函数享有同等权利。

P21 07 成员对象和封闭类

  • 要点:
    1. 成员变量(形参),等价于成员变量=形参。括号()相当于赋值操作。
    2. 成员对象(形参1,形参2),等价于通过形参1和2来初始化该成员对象。具体看下面的例子。
    3. 封闭类的构造函数后跟有冒号和成员变量的参数表。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第111张图片北京大学:C++程序设计 课堂笔记_第112张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第113张图片北京大学:C++程序设计 课堂笔记_第114张图片北京大学:C++程序设计 课堂笔记_第115张图片北京大学:C++程序设计 课堂笔记_第116张图片注:封闭类构造和析构的调用顺序:先构造的后析构;后构造的先析构。类似栈实现。构造函数:成员对象->封闭类。析构函数:封闭类->成员对象。

P22 08 友元(Friend)

  • 要点:
    1. 友元函数和友元类
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第117张图片北京大学:C++程序设计 课堂笔记_第118张图片北京大学:C++程序设计 课堂笔记_第119张图片北京大学:C++程序设计 课堂笔记_第120张图片

P23 09 this指针

  • 要点:
    1. this指针可以理解为C++程序转换为C程序所用到的指针。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第121张图片注:C++转换成C,利用C编译器编译。因此,C++的class对应于C的结构体struct,又由于C无成员函数,故C需要定义全局函数,其全局函数的参数相比较于C++成员函数要多一个形参,即this指针,它指向C++中成员函数所作用的对象,在C中即为结构体变量。
      北京大学:C++程序设计 课堂笔记_第122张图片北京大学:C++程序设计 课堂笔记_第123张图片北京大学:C++程序设计 课堂笔记_第124张图片北京大学:C++程序设计 课堂笔记_第125张图片北京大学:C++程序设计 课堂笔记_第126张图片

P24 10 常量对象,常量成员函数和常引用

  • 要点:
    1. const:保证其限定的成分不被修改。
    2. 常引用:对象的引用作为函数参数,不是对象,因此不会引发复制构造函数。而声明为常引用,确保形参不会修改原始值,既保证效率,又保证数据安全。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第127张图片北京大学:C++程序设计 课堂笔记_第128张图片北京大学:C++程序设计 课堂笔记_第129张图片北京大学:C++程序设计 课堂笔记_第130张图片北京大学:C++程序设计 课堂笔记_第131张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第132张图片北京大学:C++程序设计 课堂笔记_第133张图片在这里插入图片描述

P25 01 运算符重载

  • 要点:
    1. 注意重载成普通函数和成员函数的区别。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第134张图片北京大学:C++程序设计 课堂笔记_第135张图片北京大学:C++程序设计 课堂笔记_第136张图片北京大学:C++程序设计 课堂笔记_第137张图片北京大学:C++程序设计 课堂笔记_第138张图片北京大学:C++程序设计 课堂笔记_第139张图片北京大学:C++程序设计 课堂笔记_第140张图片北京大学:C++程序设计 课堂笔记_第141张图片北京大学:C++程序设计 课堂笔记_第142张图片

P26 02 赋值运算符重载(浅拷贝与深拷贝)

  • 要点:
    1. 赋值=重载解决的问题:c1 = c2;等号两端类型不匹配。
    2. 运算符重载可通过重载为成员函数普通函数来实现。但赋值运算符只可重载为成员函数
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第143张图片北京大学:C++程序设计 课堂笔记_第144张图片北京大学:C++程序设计 课堂笔记_第145张图片北京大学:C++程序设计 课堂笔记_第146张图片注:String s2 = "hello!"非赋值语句,而是初始化,它不会调用s2.operator=()成员函数,而是会调用String(char *)构造函数。
      北京大学:C++程序设计 课堂笔记_第147张图片北京大学:C++程序设计 课堂笔记_第148张图片北京大学:C++程序设计 课堂笔记_第149张图片注:S1 = S2;两者指向同一块地址。S1S2消亡时,内存先后释放两次,会造成内存错误或异常终止
      北京大学:C++程序设计 课堂笔记_第150张图片北京大学:C++程序设计 课堂笔记_第151张图片北京大学:C++程序设计 课堂笔记_第152张图片北京大学:C++程序设计 课堂笔记_第153张图片北京大学:C++程序设计 课堂笔记_第154张图片北京大学:C++程序设计 课堂笔记_第155张图片注:设计构造函数时,也要对其做与运算符重载同样的处理。

P27 03 运算符重载为友元函数

  • 要点:
    1. 略。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第156张图片北京大学:C++程序设计 课堂笔记_第157张图片北京大学:C++程序设计 课堂笔记_第158张图片北京大学:C++程序设计 课堂笔记_第159张图片

P28 04 运算符重载实例:长度可变的整型数组类

  • 要点:
    1. 数组大小可变的实现方法有两种:
      • 动态申请内存:newdelete
      • 长度可变:运算符重载。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第160张图片
      北京大学:C++程序设计 课堂笔记_第161张图片注:动态分配空间需要指针成员变量a2 = a;:赋值运算符重载。a2[i]:[]重载。a4(a):不能用缺省的复制构造函数,因为存在深浅拷贝的问题。
      北京大学:C++程序设计 课堂笔记_第162张图片北京大学:C++程序设计 课堂笔记_第163张图片注:非引用函数的返回值,不可以作为左值引用!
      北京大学:C++程序设计 课堂笔记_第164张图片注:初始化成员列表:CArray(int s) : size(s) { ... },将size初始化为s。调用默认复制构造函数指向了同一片内存:CArray a2(a1);,会将a1的成员变量复制给a2
      北京大学:C++程序设计 课堂笔记_第165张图片北京大学:C++程序设计 课堂笔记_第166张图片北京大学:C++程序设计 课堂笔记_第167张图片北京大学:C++程序设计 课堂笔记_第168张图片注:空间分配方案:32->64->128->...,以此类推。标准库的vector实现可变长度数组就是采用了这种方式。相比每次内存增1的方案要高效地多。

P29 05 流插入运算符和流提取运算符的重载

  • 要点:
    1. 略。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第169张图片北京大学:C++程序设计 课堂笔记_第170张图片北京大学:C++程序设计 课堂笔记_第171张图片北京大学:C++程序设计 课堂笔记_第172张图片北京大学:C++程序设计 课堂笔记_第173张图片北京大学:C++程序设计 课堂笔记_第174张图片北京大学:C++程序设计 课堂笔记_第175张图片北京大学:C++程序设计 课堂笔记_第176张图片北京大学:C++程序设计 课堂笔记_第177张图片北京大学:C++程序设计 课堂笔记_第178张图片北京大学:C++程序设计 课堂笔记_第179张图片北京大学:C++程序设计 课堂笔记_第180张图片

P30 06 自增自减运算符的重载

  • 要点:
    1. 可通过全局函数成员函数来实现。
    2. 全局函数若是想访问私有成员,需要将其声明为友元
    3. 全局函数:操作数的数目等于参数个数。比成员函数多一个参数。

  • 成员函数与全局函数的区别(参考:c++:利用成员函数和全局函数实现对运算符的重载):
    1. 全局变量可以在整个程序里使用;而局部变量只可以在一个函数或一段代码中使用。
    2. 类成员函数是面向对象,全局函数是面向过程。
    3. 类成员函数 => 全局函数:增加一个参数,增加的这个参数代替this指针。
    4. 全局函数 => 类成员函数:减少一个参数,减少的这个参数由this指针隐藏。

  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第181张图片北京大学:C++程序设计 课堂笔记_第182张图片北京大学:C++程序设计 课堂笔记_第183张图片北京大学:C++程序设计 课堂笔记_第184张图片北京大学:C++程序设计 课堂笔记_第185张图片注:深浅复制是在成员变量是指针时所考虑的。
      北京大学:C++程序设计 课堂笔记_第186张图片北京大学:C++程序设计 课堂笔记_第187张图片

P31 01 继承和派生

  • 要点:
    1. 略。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第188张图片北京大学:C++程序设计 课堂笔记_第189张图片北京大学:C++程序设计 课堂笔记_第190张图片北京大学:C++程序设计 课堂笔记_第191张图片北京大学:C++程序设计 课堂笔记_第192张图片北京大学:C++程序设计 课堂笔记_第193张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第194张图片北京大学:C++程序设计 课堂笔记_第195张图片北京大学:C++程序设计 课堂笔记_第196张图片北京大学:C++程序设计 课堂笔记_第197张图片注:PrintInfo()非重载,而是覆盖!因为重载:函数名相同,参数表不同。而覆盖是同名同参数表。
      北京大学:C++程序设计 课堂笔记_第198张图片在这里插入图片描述

P32 02 复合关系和继承关系

  • 要点:
    1. 类间关系包含以下三种:
      1. 没关系
      2. 继承关系:
      3. 复合关系:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第199张图片北京大学:C++程序设计 课堂笔记_第200张图片北京大学:C++程序设计 课堂笔记_第201张图片北京大学:C++程序设计 课堂笔记_第202张图片北京大学:C++程序设计 课堂笔记_第203张图片注:使Circle方便操作center的成员变量,最好声明为CPoint的友元函数。
      北京大学:C++程序设计 课堂笔记_第204张图片北京大学:C++程序设计 课堂笔记_第205张图片北京大学:C++程序设计 课堂笔记_第206张图片注:这样的定义方式是:人中有狗,狗中有人。重复定义,CMaster体积包含1个CDog对象,而CDog体积又包含CMaster
      北京大学:C++程序设计 课堂笔记_第207张图片注:这种定义方式,如何维护不同的狗的相同的主任的信息一致性问题。修改一个狗主人信息,需要全部修改。
      北京大学:C++程序设计 课堂笔记_第208张图片注:复合关系的定义:类的成员对象是另一个类的固有属性或组成成分。而狗非主人的固有属性。狗没有了狗格“人格”:对狗操作,必须要对其主人进行操作,没有自由,不能独立活动。
      北京大学:C++程序设计 课堂笔记_第209张图片注:一个类是另一个类的指针,称两个类是知道的关系。一个类的对象通过指针就能知道另一个类的对象。类似于双向树

P33 03 基类派生类同名成员和Protected关键字

  • 要点:
    1. 基类派生类的同名成员包括:同名成员变量、同名成员函数。不推荐!
    2. 同名条件下,访问基类成员的方式:
      • 函数访问:基类::成员
      • 对象访问:对象.基类::成员
    3. 派生类不能访问基类的私有成员变量。必须声明为protected类型才行,但是也只能允许当前对象访问。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第210张图片北京大学:C++程序设计 课堂笔记_第211张图片北京大学:C++程序设计 课堂笔记_第212张图片
      北京大学:C++程序设计 课堂笔记_第213张图片北京大学:C++程序设计 课堂笔记_第214张图片北京大学:C++程序设计 课堂笔记_第215张图片

P34 04 派生类的构造函数

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第216张图片北京大学:C++程序设计 课堂笔记_第217张图片北京大学:C++程序设计 课堂笔记_第218张图片

P35 05 public继承的赋值兼容规则

  • 要点:
    1.派生类构造函数前会从最顶层基类开始依次执行各个基类的构造函数。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第219张图片北京大学:C++程序设计 课堂笔记_第220张图片北京大学:C++程序设计 课堂笔记_第221张图片北京大学:C++程序设计 课堂笔记_第222张图片北京大学:C++程序设计 课堂笔记_第223张图片

P36 01 多态和虚函数

  • 要点:
    1. 多态:提高程序可扩充性。
    2. 虚函数可参与多态,而普通成员函数不能。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第224张图片北京大学:C++程序设计 课堂笔记_第225张图片北京大学:C++程序设计 课堂笔记_第226张图片北京大学:C++程序设计 课堂笔记_第227张图片北京大学:C++程序设计 课堂笔记_第228张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第229张图片
      北京大学:C++程序设计 课堂笔记_第230张图片

P37 02 使用多态的游戏程序实例

  • 要点:
    1. 新增怪物:使用多态可以使得代码改动和增加量最小。
    2. 新增怪物可通过基类指针指向派生类对象来实现。
    3. 顶层基类:概括了所有怪物的共同特点。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第231张图片北京大学:C++程序设计 课堂笔记_第232张图片北京大学:C++程序设计 课堂笔记_第233张图片北京大学:C++程序设计 课堂笔记_第234张图片北京大学:C++程序设计 课堂笔记_第235张图片北京大学:C++程序设计 课堂笔记_第236张图片北京大学:C++程序设计 课堂笔记_第237张图片北京大学:C++程序设计 课堂笔记_第238张图片北京大学:C++程序设计 课堂笔记_第239张图片北京大学:C++程序设计 课堂笔记_第240张图片北京大学:C++程序设计 课堂笔记_第241张图片北京大学:C++程序设计 课堂笔记_第242张图片北京大学:C++程序设计 课堂笔记_第243张图片注:基类指针p是一个指向派生类对象的指针,保存了派生类对象的地址。利用了public继承的赋值兼容规则3:派生类对象的地址可以赋值给基类指针

P38 03更多多态程序实例

  • 要点:
    1. 纯虚函数:无函数体
  • 问题1:为什么构造函数和析构函数中调用虚函数,不是多态?
    理由:当一个派生类对象那个初始化时,会先执行基类对象的构造函数。在基类对象的构造函数执行期间,派生类对象它自己的那部分成员变量还未被初始化。如果在基类构造函数执行期间调用虚函数,还允许虚函数是多态的话,那么在基类的构造函数执行期间就会调用派生类的虚函数,这是由于多态,这时派生类对象它自己的成员变量还未被初始化好,此时执行派生类对象的成员函数,有可能不正确。因此,不能在基类的构造函数执行派生类的虚函数。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第244张图片北京大学:C++程序设计 课堂笔记_第245张图片北京大学:C++程序设计 课堂笔记_第246张图片北京大学:C++程序设计 课堂笔记_第247张图片北京大学:C++程序设计 课堂笔记_第248张图片北京大学:C++程序设计 课堂笔记_第249张图片北京大学:C++程序设计 课堂笔记_第250张图片注:pShape[i]:基类指针;PrintInfo():基类和派生类的同名虚函数。因此为多态:指向的对象为哪个派生类,就调用哪个对象的虚函数。
      北京大学:C++程序设计 课堂笔记_第251张图片注:*S1:void类型,占用多少个字节未知,因此直接取内容会编译出错。
      北京大学:C++程序设计 课堂笔记_第252张图片
      北京大学:C++程序设计 课堂笔记_第253张图片北京大学:C++程序设计 课堂笔记_第254张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第255张图片注:this:基类指针;func2():虚函数。因此调用过程取决于this指针是哪种类型的对象。
      北京大学:C++程序设计 课堂笔记_第256张图片北京大学:C++程序设计 课堂笔记_第257张图片北京大学:C++程序设计 课堂笔记_第258张图片

P39 04 多态实现原理

  • 要点:
    1. 每一个含有虚函数的类(基类或继承含有虚函数的基类的派生类)都有一个虚函数表。虚函数表存放了所有虚函数的内存地址。
    2. 多态的代价:会有额外的时间和空间开销。其中,时间开销是查找虚函数表;空间开销是每个对象都多了4个字节的内存空间,存放虚函数表。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第259张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第260张图片北京大学:C++程序设计 课堂笔记_第261张图片

P40 虚析构函数

  • 要点:
    1. 通过基类指针删除派生类对象时(delete p),仅调用基类析构函数。导致派生类无法回收内存空间。
    2. 基类析构函数声明为virtual,使得delete p先调用派生类析构函数,再调用基类析构函数。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第262张图片北京大学:C++程序设计 课堂笔记_第263张图片北京大学:C++程序设计 课堂笔记_第264张图片北京大学:C++程序设计 课堂笔记_第265张图片北京大学:C++程序设计 课堂笔记_第266张图片

P41 纯虚函数和抽象类

  • 要点:
    1. 包含纯虚函数的类,称为抽象类。
    2. 抽象类的指针和引用,只能指向由抽象类派生而来的派生类的对象。
    3. 派生类实现抽象类的所有纯虚函数,才能称为非抽象类。包含一对{}也相当于实现化。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第267张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第268张图片北京大学:C++程序设计 课堂笔记_第269张图片

P42 文件操作

  • 要点:
    1. ifstream:input。从文件中读取数据,输入到文件流对象。
    2. ofstream:output。文件流对象输出,写入数据到文件中,
    3. fstream:既可读取数据,也能写入数据。
    4. 文件读取必须遵循以下流程:打开文件 -> 读/写文件 -> 关闭文件。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第270张图片北京大学:C++程序设计 课堂笔记_第271张图片北京大学:C++程序设计 课堂笔记_第272张图片北京大学:C++程序设计 课堂笔记_第273张图片北京大学:C++程序设计 课堂笔记_第274张图片北京大学:C++程序设计 课堂笔记_第275张图片北京大学:C++程序设计 课堂笔记_第276张图片北京大学:C++程序设计 课堂笔记_第277张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第278张图片北京大学:C++程序设计 课堂笔记_第279张图片北京大学:C++程序设计 课堂笔记_第280张图片北京大学:C++程序设计 课堂笔记_第281张图片北京大学:C++程序设计 课堂笔记_第282张图片北京大学:C++程序设计 课堂笔记_第283张图片北京大学:C++程序设计 课堂笔记_第284张图片北京大学:C++程序设计 课堂笔记_第285张图片北京大学:C++程序设计 课堂笔记_第286张图片

P43 函数模板

  • 要点:
    1. C++突出特性:抽象、封装、继承、多态、模板。
    2. 函数模板 => 泛型程序设计。
    3. 函数模板简单地实现 “重载”的功能。例如Swap交换intfloatdouble等。
    4. 模板 + 重载 ,需要定义多个参数类型避免二义性。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第287张图片北京大学:C++程序设计 课堂笔记_第288张图片北京大学:C++程序设计 课堂笔记_第289张图片北京大学:C++程序设计 课堂笔记_第290张图片北京大学:C++程序设计 课堂笔记_第291张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第292张图片北京大学:C++程序设计 课堂笔记_第293张图片北京大学:C++程序设计 课堂笔记_第294张图片北京大学:C++程序设计 课堂笔记_第295张图片北京大学:C++程序设计 课堂笔记_第296张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第297张图片北京大学:C++程序设计 课堂笔记_第298张图片

P44 类模板

  • 要点:
    1. 类模板中的函数模板的类型参数不能使用同一个。
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第299张图片北京大学:C++程序设计 课堂笔记_第300张图片北京大学:C++程序设计 课堂笔记_第301张图片北京大学:C++程序设计 课堂笔记_第302张图片北京大学:C++程序设计 课堂笔记_第303张图片北京大学:C++程序设计 课堂笔记_第304张图片北京大学:C++程序设计 课堂笔记_第305张图片北京大学:C++程序设计 课堂笔记_第306张图片北京大学:C++程序设计 课堂笔记_第307张图片北京大学:C++程序设计 课堂笔记_第308张图片北京大学:C++程序设计 课堂笔记_第309张图片北京大学:C++程序设计 课堂笔记_第310张图片北京大学:C++程序设计 课堂笔记_第311张图片北京大学:C++程序设计 课堂笔记_第312张图片
      北京大学:C++程序设计 课堂笔记_第313张图片北京大学:C++程序设计 课堂笔记_第314张图片北京大学:C++程序设计 课堂笔记_第315张图片北京大学:C++程序设计 课堂笔记_第316张图片

P45 string类

  • 要点:
    1. string,模板类实现
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第317张图片北京大学:C++程序设计 课堂笔记_第318张图片北京大学:C++程序设计 课堂笔记_第319张图片北京大学:C++程序设计 课堂笔记_第320张图片北京大学:C++程序设计 课堂笔记_第321张图片北京大学:C++程序设计 课堂笔记_第322张图片北京大学:C++程序设计 课堂笔记_第323张图片北京大学:C++程序设计 课堂笔记_第324张图片北京大学:C++程序设计 课堂笔记_第325张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第326张图片北京大学:C++程序设计 课堂笔记_第327张图片北京大学:C++程序设计 课堂笔记_第328张图片北京大学:C++程序设计 课堂笔记_第329张图片北京大学:C++程序设计 课堂笔记_第330张图片北京大学:C++程序设计 课堂笔记_第331张图片北京大学:C++程序设计 课堂笔记_第332张图片北京大学:C++程序设计 课堂笔记_第333张图片北京大学:C++程序设计 课堂笔记_第334张图片

P46 输入输出

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第335张图片北京大学:C++程序设计 课堂笔记_第336张图片北京大学:C++程序设计 课堂笔记_第337张图片北京大学:C++程序设计 课堂笔记_第338张图片北京大学:C++程序设计 课堂笔记_第339张图片北京大学:C++程序设计 课堂笔记_第340张图片北京大学:C++程序设计 课堂笔记_第341张图片注:cin >> x强制类型转换运算符的重载。虽然返回值为cin,经过fstream强制类型转换为布尔类型的值。
      北京大学:C++程序设计 课堂笔记_第342张图片北京大学:C++程序设计 课堂笔记_第343张图片注:peek读入但不流失,可判断输入流的数据类型。EOF = -1
      北京大学:C++程序设计 课堂笔记_第344张图片

P47 STL 标准模板库

  • 要点:
    1. 容器使用前,一定要了解各个容器的时间复杂度。针对具体情况,择优选取。
    2. 顺序容器:vector 动态数组(32->64->128->256);deque 双向队列(两端增删,性能佳);list 双向链表。
    3. 关联容器:排好序的,查找速度快。set:集合;multiset:允许有相同元素;map:字典(key:value);multimap:允许key相同。
    4. 容器适配器:stackqueueprority-queue:优先级队列。
    5. 反向迭代器++,会指向前一个元素,与正向不同。
    6. 双向迭代器* p返回的是引用。
  • 课件
    • 如下:
      在这里插入图片描述北京大学:C++程序设计 课堂笔记_第345张图片北京大学:C++程序设计 课堂笔记_第346张图片北京大学:C++程序设计 课堂笔记_第347张图片北京大学:C++程序设计 课堂笔记_第348张图片
      北京大学:C++程序设计 课堂笔记_第349张图片北京大学:C++程序设计 课堂笔记_第350张图片北京大学:C++程序设计 课堂笔记_第351张图片北京大学:C++程序设计 课堂笔记_第352张图片在这里插入图片描述
      北京大学:C++程序设计 课堂笔记_第353张图片北京大学:C++程序设计 课堂笔记_第354张图片北京大学:C++程序设计 课堂笔记_第355张图片北京大学:C++程序设计 课堂笔记_第356张图片北京大学:C++程序设计 课堂笔记_第357张图片北京大学:C++程序设计 课堂笔记_第358张图片北京大学:C++程序设计 课堂笔记_第359张图片北京大学:C++程序设计 课堂笔记_第360张图片北京大学:C++程序设计 课堂笔记_第361张图片北京大学:C++程序设计 课堂笔记_第362张图片北京大学:C++程序设计 课堂笔记_第363张图片北京大学:C++程序设计 课堂笔记_第364张图片北京大学:C++程序设计 课堂笔记_第365张图片北京大学:C++程序设计 课堂笔记_第366张图片北京大学:C++程序设计 课堂笔记_第367张图片北京大学:C++程序设计 课堂笔记_第368张图片北京大学:C++程序设计 课堂笔记_第369张图片北京大学:C++程序设计 课堂笔记_第370张图片北京大学:C++程序设计 课堂笔记_第371张图片北京大学:C++程序设计 课堂笔记_第372张图片北京大学:C++程序设计 课堂笔记_第373张图片北京大学:C++程序设计 课堂笔记_第374张图片北京大学:C++程序设计 课堂笔记_第375张图片
      北京大学:C++程序设计 课堂笔记_第376张图片

P49 顺序容器vector

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第377张图片北京大学:C++程序设计 课堂笔记_第378张图片北京大学:C++程序设计 课堂笔记_第379张图片北京大学:C++程序设计 课堂笔记_第380张图片北京大学:C++程序设计 课堂笔记_第381张图片北京大学:C++程序设计 课堂笔记_第382张图片

P50 List和Deque

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第383张图片北京大学:C++程序设计 课堂笔记_第384张图片北京大学:C++程序设计 课堂笔记_第385张图片北京大学:C++程序设计 课堂笔记_第386张图片北京大学:C++程序设计 课堂笔记_第387张图片北京大学:C++程序设计 课堂笔记_第388张图片北京大学:C++程序设计 课堂笔记_第389张图片北京大学:C++程序设计 课堂笔记_第390张图片北京大学:C++程序设计 课堂笔记_第391张图片北京大学:C++程序设计 课堂笔记_第392张图片北京大学:C++程序设计 课堂笔记_第393张图片

P51 函数对象

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第394张图片北京大学:C++程序设计 课堂笔记_第395张图片北京大学:C++程序设计 课堂笔记_第396张图片北京大学:C++程序设计 课堂笔记_第397张图片北京大学:C++程序设计 课堂笔记_第398张图片北京大学:C++程序设计 课堂笔记_第399张图片北京大学:C++程序设计 课堂笔记_第400张图片北京大学:C++程序设计 课堂笔记_第401张图片北京大学:C++程序设计 课堂笔记_第402张图片北京大学:C++程序设计 课堂笔记_第403张图片北京大学:C++程序设计 课堂笔记_第404张图片北京大学:C++程序设计 课堂笔记_第405张图片北京大学:C++程序设计 课堂笔记_第406张图片北京大学:C++程序设计 课堂笔记_第407张图片北京大学:C++程序设计 课堂笔记_第408张图片北京大学:C++程序设计 课堂笔记_第409张图片

P52 set 和 multiset

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第410张图片北京大学:C++程序设计 课堂笔记_第411张图片北京大学:C++程序设计 课堂笔记_第412张图片北京大学:C++程序设计 课堂笔记_第413张图片北京大学:C++程序设计 课堂笔记_第414张图片北京大学:C++程序设计 课堂笔记_第415张图片北京大学:C++程序设计 课堂笔记_第416张图片北京大学:C++程序设计 课堂笔记_第417张图片北京大学:C++程序设计 课堂笔记_第418张图片北京大学:C++程序设计 课堂笔记_第419张图片北京大学:C++程序设计 课堂笔记_第420张图片北京大学:C++程序设计 课堂笔记_第421张图片

P53 map和multimap

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第422张图片北京大学:C++程序设计 课堂笔记_第423张图片北京大学:C++程序设计 课堂笔记_第424张图片北京大学:C++程序设计 课堂笔记_第425张图片北京大学:C++程序设计 课堂笔记_第426张图片北京大学:C++程序设计 课堂笔记_第427张图片北京大学:C++程序设计 课堂笔记_第428张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第429张图片北京大学:C++程序设计 课堂笔记_第430张图片北京大学:C++程序设计 课堂笔记_第431张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第432张图片北京大学:C++程序设计 课堂笔记_第433张图片北京大学:C++程序设计 课堂笔记_第434张图片在这里插入图片描述北京大学:C++程序设计 课堂笔记_第435张图片北京大学:C++程序设计 课堂笔记_第436张图片

P54 容器适配器

  • 要点:
  • 课件
    • 如下:
      北京大学:C++程序设计 课堂笔记_第437张图片北京大学:C++程序设计 课堂笔记_第438张图片北京大学:C++程序设计 课堂笔记_第439张图片北京大学:C++程序设计 课堂笔记_第440张图片北京大学:C++程序设计 课堂笔记_第441张图片北京大学:C++程序设计 课堂笔记_第442张图片北京大学:C++程序设计 课堂笔记_第443张图片北京大学:C++程序设计 课堂笔记_第444张图片

P55

  • 要点:
  • 课件
    • 如下:

未完待续…

你可能感兴趣的:(C/C++程序设计)