概述
高级程序设计复习笔记
参考书目:
《程序设计教程—用C++语言描述》陈家骏、郑滔
《Thinking in C++》机械工业出版社
第1章 复习程设基础
杂记
分数组成:
作业10%
上机40%(现场oj和课后projects)
期末50%(据说较为简单)
C/C++数据类型
unsigned
类型运算不封闭,+*/封闭,-不封闭
float
类型 0.1+0.2!=0.3之类的
实数
相等条件,比较差的绝对值是否小于一个很小的数
联合类型用于用一种类型表示多种类型的数据,例如不同类型的数据组织在一起不能用array
指针是内存地址的抽象,用于动态变量(链表)、传递参数
C++过程抽象
C++函数
与数学函数
区别:
- C++函数可以没有返回值
- 可以有副作用(side effect)
- 同一个实参,不同时刻调用结果可以不一样
内存区安排
静态数据区
- 全局变量
- static局部变量
- 常量
第2章 对象与类
把成员函数定义放在声明处,是建议编译器按内联函数处理。
构造函数
创建动态对象不用 malloc 和 free,原因是不会调用构造函数和析构函数。
无参数或全是默认参数的构造函数,是默认构造函数
隐式的构造函数仅调用成员对象
所在类和基类的构造函数
一旦随便自定义了构造函数,编译器不再提供隐式构造函数
隐式的析构函数仅调用成员对象
所在类和基类的析构函数
复制字符串时候 new char(strlen(str) + 1)
数据成员初始化
1 | class A { |
const int 和 int& 数据成员必须用成员初始化表,如果这样的类不自定义构造函数,编译器不会为其生成默认构造函数,因此这样的类不能用于构造对象?
成员对象的初始化:默认按照成员对象的默认构造函数来,除非用成员初始化表进行显式调用,顺序 A1-A2-A3-B函数体,析构顺序 B函数体-A3-A2-A1
拷贝构造函数
1 | A(const A& a); |
隐式拷贝构造函数:普通成员直接拷贝(涉及资源申请的小心),成员对象调用它的拷贝构造函数
自定义拷贝构造函数:默认按照成员对象的默认构造函数来,除非用成员初始化表显式调用成员对象的拷贝构造函数,如
1 | class A { |
const 成员函数
const 对象不能调用非 const 成员函数,所以
1 | f(const A* pa); // *pa无法被改变 |
const 成员函数可以重载,效果[UST]
1 | void f() const; // 谁调用? |
题外话
1 | const int* p / int const * p; // *p无法修改 |
static 成员
算是 class 的属性,所有对象共享。
1 | class A { |
友元
访问 private 和 protected
是数据保护
和数据访问效率
的折衷
Demeter 法则
一个类的成员函数除了自己的直接子结构(数据成员),不能依赖于其他类
1 | class A{ |
转移构造函数
系统自动调用,用于返回一个对象的时候,节约资源
1 | A(A&& x) { |
操作符重载
作为类的非静态成员函数
单目还是单目,双目还是双目。
*既作为解引用,又作为乘法,咋办?[UST][CJJ: *默认已经作为解引用重载好了,只管乘法就行]
“.”, “.*”, “::”, “?:”, “sizeof” 不能重载
A& operator++(); // 效果++a
A operator++(int i); // 效果a++,似乎是个右值表达式,似乎有骚操作
= 操作符重载
=操作符被隐式重载,但如果类中有 const int 和 int& 成员时,=不会隐式重载。
同拷贝构造函数的理,=操作符同样有即将消亡的对象赋值浪费的问题。
改进方法如下,该调用的时候编译器自动调用
1 | A& operator=(A&& x) { |
new 重载
作为类的 static 函数重载,static 可以不写
1 | void* operator new(size_t size) // size_t size必须有,别的无所谓 |
#第3章 lamda 表达式
1 | { int k,m,n; //环境变量 |