北航c++期末考试复习
c++
迭代器,工程模式,观察者模式必考
变量
基本数据类型
void
bool
char
int
float
double
wchar_t = short int
Typedef newType oriType;
sizeof 三种用法
- sizeof(object)
- sizeof object
- sizeof(type)
变量名称
- 名称中只能用字母字符, 数字和下划线(_)
- 第一个字符不能为数字
- 区分大小写字符
- 不能将c++关键字用作名称
- 用两个下划线或下划线和大写字母大头的名称被保留编译器给实现。 以一个下划线开头的名称被保留给实现。
数组
初始化
int counts[10] = {} 会把所有元素设置为0
初始化数组时可以省略等号
double earnings[4] {1,2,3,4}
字符串数组
sizeof会计算整个数组的大小, 包括\0 但是strlen只计算可见字符的数量
cin.getline(arrStartm size) // 用来读取一行
这个函数会读取换行符, 并且从缓冲区中取走
cin.get 不会拿走换行符
String 类
String str1 = “1231”;
或者striuing str = {“12312”};
getline(cin, str)
vector和array
用来替代一般数组
- vector为变长容器, array为定长
- vector可以动态添加, array需要自己完成
函数
占位符和默认参数
- 默认参数
只有在函数列表最后的几项可以使用默认参数。
一旦在一次函数调用中使用默认参数, 那么其之后的所有项都必须用默认参数。
在函数调用中如果对于某个默认参数赋值, 那么这个参数之前的所有参数一定要赋值 - 占位符
int func(int a, int)
最后这个int就是占位参数
在调用的时候必须赋值
指针
函数指针声明
void (*param)(int)
param = func
内存模型和名称空间
单独编译
头文件中的内容
- 函数原型
- 使用#define 和const定义的符号常量
- 结构声明
- 类声明
- 模板声明
- 内联函数
存储持续性
- 自动
在函数中和if while for块中定义的变量, 在块结束后自动释放空间。 - 静态存储
Static 存储在bss(未初始化)或者data(初始化)段 - 线程存储持续性
声明周期和线程一样长 - 动态存储
new时开辟空间, delete时释放空间
如果在子块中定义了和父块一样的变量, 那么在字块中父块的变量暂时被屏蔽
{
int x; // x1
if () {
int x; // x2
x = x + 1; // using x2
}
x = x + 1; // using x1
}
使用static可以把变量的作用域限制在当前文件, 并且使用static可以覆盖其他文件中的变量
file1:
static int x1 = 2;
int x2 = 2;
file2:
extern static int x1; // invalid
extern int x2; // valid
存储说明符
-
auto
-
register
-
static
-
extern
-
thread local
-
mutable
mutable可以打破const的限制
struct Person {
int x1;
mutable int x2;
};const Person p = {1, 2};
p.x1 = 3; // invalid
p.x2 = 3; // valid 因为mutable打破了const的限制
new and delete
c++ 11中允许用new 来初始化数组
int *arr = new int[5]{1,2,3,4,5};
名称空间
名称空间可以限制变量, 函数, 类, 结构体的作用域。
using命令设置全局名称空间。
类和对象
构造
当一个类把其他类当做自己的成员时, 在创建类的时候会优先调用成员的构造函数
只有类中没有定义任何构造函数的时候, c++编译器才会提供默认构造函数
class Staock
{
Stock() {...};
}
int main()
{
Stock s1; //会报错, 因为这个时候Stock中有构造函数, 没有默认函数
}
Stock::Stock() {} // 这个是默认构造函数
构造函数初始化列表
A (int x, int y) : this.x(x), this.y(y)
{
...
}
c++构造函数不可以被继承, 但是
- 如果子类没有定义构造函数, 会自动调用父类的无参数构造方法
- 如果子类定义了自己的构造函数,并且没有显示调用父类构造函数, 会先调用父类的无参数构造方法, 再调用自己的构造方法
- 如果子类没有显示调用父类的构造方法, 会调用父类的无参数构造方法, 如果父类此时没有无参数构造方法, 则会报错。
- 如果子类调用父类的带参方法, 需要初始化父类成员对象的方式。
权限
public: 类内部, 外部, 友元函数, 子类都可访问
private: 类内和友元可以访问, 子类和外部不可访问
protected: 类内, 友元和子类可以访问,外部不可以访问
默认函数
c++ 编译时会给一个类加入以下的默认函数
-
构造函数
-
拷贝函数
c++中三种情况会调用拷贝函数- 函数传入
- 函数返回
- A b = a; 用另外一个对象初始化新的对象
拷贝函数的声明为[class Name](const [class name]& x)
-
析构函数
-
赋值函数
调用时b = a
重载时
A& operator = (const A& other)
{}
-
取值函数
default调用默认
delete可以禁用某个函数
析构
析构函数只有一个, 不可以被重载
不可以被继承
运算符重载
友元函数重载运算符的时候至少要有一个参数, 一元一个, 二元两个
cast
dynamic_cast<LOW*> (p); 只有LOW是p的基类才可以, 否则返回NULL
const_cast 把一个const pointer改为非const, 除了const volatile不同外, 表达式和转换类型必须相同
static_cast可以High到Low也可以Low到High但不可以无关类
reinterpret_cast基本任何转换
友元
友元不可以被继承
指针
智能指针
Auto_ptr<>
unique_ptr<> 只能有一个指针指向对象
Shared_ptr<>
引用
- 引用左值
- 引用右值(函数返回值, 常量, 表达式)
当引用对象和被引用对象类型不匹配时, 会创建新变量, 相当于回到了按值传递
模板
类模板中的所有成员函数都是模板函数。
模板是虚的函数, 如果没有显式调用<>, 编译器会优先用非模板。
一些关键字
-
Sizeof
-
const
在c++中const是内部链接的, 因此可以再不同文件中定义相同的const变量
使用extern const可以覆盖其内部链接型
const成员函数只能读取数据成员, 不可以写数据成员
const类只能调用const成员函数 -
static
static成员函数只能访问static成员变量或者static成员函数 static是内部链接的
-
volatile
volatile不做编译优化, 每次必须从内存中读取 -
decltype
decltype(expressioni) variable 把variable设置为和expression相同的类型
其他
.a 静态库
.so 动态库
.lib 静态库
.dll 动态库
char *c = “abc” 此时abc放在了常量区, 修改的话会导致程序崩溃
Char c[] 放在了栈区域
char c = (char) malloc(sizeof(char) * k)
对于指针和数组 c++用了不同方式处理
对于int** arr, 访问两次
对于int arr[][] 永远只访问一次
数组sizeof返回的是真实数组的大小
指针sizeof放回的是8B
抽象类只能作为基类, 只能作为指针, 不可以实例化。
static和inline 函数不能为虚函数
私有继承不可以隐式向上转换
Int &a = 2; 会编译失败, 因为2放在了常量区, 常量不可以左值引用
const int&a = 2; 编译成功
int &a左值引用
int &&a右值引用
右值:无法用过变量名查询到的值, 比如函数返回值等, = 号右边的值
Const int& 也可以延长右值的存在时间
静态就是让变量和
设计模式
上一篇: CSS布局中常用的文字排版相关属性详解