北航c++期末考试复习

c++

笔者总结了北航计算机系c++考试的一些重点, 希望对以后复习的同学能有所帮助

迭代器,工程模式,观察者模式必考

变量

基本数据类型

void

bool

char

int

float

double

wchar_t = short int

Typedef newType oriType;

sizeof 三种用法

  1. sizeof(object)
  2. sizeof object
  3. sizeof(type)

变量名称

  1. 名称中只能用字母字符, 数字和下划线(_)
  2. 第一个字符不能为数字
  3. 区分大小写字符
  4. 不能将c++关键字用作名称
  5. 用两个下划线或下划线和大写字母大头的名称被保留编译器给实现。 以一个下划线开头的名称被保留给实现。

数组

初始化

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

用来替代一般数组

  1. vector为变长容器, array为定长
  2. vector可以动态添加, array需要自己完成

函数

占位符和默认参数

  • 默认参数
    只有在函数列表最后的几项可以使用默认参数。
    一旦在一次函数调用中使用默认参数, 那么其之后的所有项都必须用默认参数。
    在函数调用中如果对于某个默认参数赋值, 那么这个参数之前的所有参数一定要赋值
  • 占位符
    int func(int a, int)
    最后这个int就是占位参数
    在调用的时候必须赋值
    指针
    函数指针声明
    void (*param)(int)
    param = func

内存模型和名称空间

单独编译

头文件中的内容

  1. 函数原型
  2. 使用#define 和const定义的符号常量
  3. 结构声明
  4. 类声明
  5. 模板声明
  6. 内联函数

存储持续性

  1. 自动
    在函数中和if while for块中定义的变量, 在块结束后自动释放空间。
  2. 静态存储
    Static 存储在bss(未初始化)或者data(初始化)段
  3. 线程存储持续性
    声明周期和线程一样长
  4. 动态存储
    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

存储说明符

  1. auto

  2. register

  3. static

  4. extern

  5. thread local

  6. 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++构造函数不可以被继承, 但是

  1. 如果子类没有定义构造函数, 会自动调用父类的无参数构造方法
  2. 如果子类定义了自己的构造函数,并且没有显示调用父类构造函数, 会先调用父类的无参数构造方法, 再调用自己的构造方法
  3. 如果子类没有显示调用父类的构造方法, 会调用父类的无参数构造方法, 如果父类此时没有无参数构造方法, 则会报错。
  4. 如果子类调用父类的带参方法, 需要初始化父类成员对象的方式。

权限

public: 类内部, 外部, 友元函数, 子类都可访问

private: 类内和友元可以访问, 子类和外部不可访问

protected: 类内, 友元和子类可以访问,外部不可以访问

默认函数

c++ 编译时会给一个类加入以下的默认函数

  1. 构造函数

  2. 拷贝函数
    c++中三种情况会调用拷贝函数

    1. 函数传入
    2. 函数返回
    3. A b = a; 用另外一个对象初始化新的对象
      拷贝函数的声明为[class Name](const [class name]& x)
  3. 析构函数

  4. 赋值函数
    调用时b = a
    重载时
    A& operator = (const A& other)
    {

    }
    
  5. 取值函数

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<>

引用

  1. 引用左值
  2. 引用右值(函数返回值, 常量, 表达式)

当引用对象和被引用对象类型不匹配时, 会创建新变量, 相当于回到了按值传递

模板

类模板中的所有成员函数都是模板函数。

模板是虚的函数, 如果没有显式调用<>, 编译器会优先用非模板。

一些关键字

  • 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& 也可以延长右值的存在时间

静态就是让变量和

设计模式

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值