欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

北航c++期末考试复习

程序员文章站 2022-03-08 20:42:10
...

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

静态就是让变量和

设计模式

相关标签: c++ 学习 笔记