Bootstrap

C++八股

基础编程

内存分区

  1. 代码区:存放函数的二进制代码,由操作系统进行管理
  2. 全局区:存放全局变量和静态变量以及常量
  3. 栈区:由编译器自动分配和释放,存放函数的参数值,局部变量等
  4. 堆区:由程序员分配和释放,若程序员不分配释放,则由操作系统回收

new操作符

在堆区开辟数据,返回时数据对应的类型指针,释放用delete。

引用

  1. 本质是一个指针常量,指向的内容不可改变
  2. 给变量起别名:数据类型 &别名 = 原名
  3. 引用在初始化后不可修改
  4. 引用可以作为函数调用的左值(可以返回一个局部变量)

函数占位参数

在定义函数时,形参可以使用int之类的数据类型占用一个位置

函数重载

  1. 可以提高代码的复用性
  2. 必须在同一个作用域下,函数名称相同,函数参数的返回类型、参数个数、参数顺序至少一个不同
  3. 改变函数的返回值不是重载

访问权限

  1. pubilc:全局访问
  2. protected:类内可访问,类外不可访问(父类中的protected内容,子类可以访问)
  3. private:类内可访问,类外不可访问(父类中的private内容,子类不可以访问)

构造函数与析构函数

构造函数:在创建对象时为对象的成员属性赋值,构造函数由编译器自动调用

如果用户定义了有参构造函数,C++将不在提供默认无参构造,但会提供默认拷贝构造

如果用户定义了拷贝构造函数,C++不会提供其它的构造函数

按参数分类

  1. 有参构造
  2. 无参构造

按类型分类

  1. 普通构造
  2. 拷贝构造(使用一个创建完毕的对象初始化一个新的对象,使用值传递的方式返回)

调用方式

  1. 括号法
  2. 显示法
  3. 隐式转换法

析构函数:在对象销毁前自动调用,执行清理工作

深拷贝与浅拷贝

浅拷贝:简单的赋值操作

深拷贝:在堆区重新申请内存空间,进行拷贝操作

初始化列表

构造函数():属性1(值1),属性2(值2)...()

可以加快属性的初始化

静态成员变量

  1. 不属于某个对象上,所有对象都共享同一份数据,类内生命、类外初始化(用::初始化),访问方式:通过对象进行访问(对象.成员)、通过类名进行访问(类名::成员)
  2. 类外访问不了私有成员变量

静态成员函数

  1. 所有对象共享一个函数
  2. 静态成员函数只能访问静态成员变量(无法区分非静态成员变量的归属)
  3. 类外访问不了私有静态成员函数

成员变量与成员函数时分开存储的

  1. 空对象占用的内存空间为1(编译器为了区分各个对象在内存中的占用位置),每个空对象应该有一个独一无二的内存地址。
  2. 非静态成员变量,属于类的对象上;静态成员变量不属于类的对象上;(非)静态成员函数,不属于类对象。

this指针

  1. 本质是指针常量,指针的指向是不允许修改的,指针指向的值是可以修改的 
  2. this指针指向被调用的成员函数所属的对象(哪个对象调用,this就指向哪个
  3. this无需定义,直接使用
  4. 用途:当形参和成员变量同名时,可以用this指针区分;在非静态成员函数中返回对象本身,可以用teturn *this(返回值要用引用的方式传递:类&,不会创建新的对象,如果直接返回类,会自动调用拷贝构造函数创建新的对象

空指针

空指针所创建的对象无法访问成员变量

常函数与常对象

  1. 在成员变量后加const,修饰的是this指向,则其指向的值不可修改
  2. 如果需要修改需要在定义前加入关键字mutable
  3. 常对象与常函数的特点基本一致

注意:常对象只能调用常函数

友元

目的是让一个函数或类访问另一个类中的私有成员

friend

全局函数做又元

在声明类的第一行做一个函数声明,函数前加一个关键字friend

类做又元

在声明类的第一行做一个类声明,类前加一个关键字friend

全局函数做又元

在声明类的第一行做一个全局函数声明,全局函数前加一个关键字friend

运算符重载

使用operator+

继承

 

 继承中父类和子类的构造和析构的顺序

 继承中同名成员处理方式

直接调用,访问的是子类成员,如果通过子类对象访问父类的成员,需要加父类作用域

 

 

 菱形继承

 当两个父类拥有相同的属性时,需要加以作用域区分

   

 多态

  如果想运行子类的方法,则需要在运行阶段才绑定地址,使用vitual关键字

动态多态的满足条件

  1. 有继承关系
  2. 子类重写父类的虚函数
  3. 使用父类的指针或引用,执行子类的对象

重写概念:函数返回类型、函数名、函数参数列表完全一致

多态的底层原理

虚函数的出现,将会导致类的内部发生改变,生成了一个虚函数表指针,其指向了虚函数的函数入口地址,当子类重写了虚函数的时候,子类中虚函数表 内部 会替换成 子类的虚函数地址

对文件的操作

  1. ofstream 写操作
  2. ifstream 读操作
  3. fstream 读写操作

  

 文件打开方式可以配合使用,利用 | 操作符

读文件

 二进制文件读写

写文件

读文件

 

 高级编程

模板-泛型编程

自动类型推导

function(参数)

显示指定类型

function<类型>(参数)

注意事项

 普通函数与函数模板的区别

 普通函数和函数模板的调用规则

 使用空模板的参数列表强制调用函数模板

function<>(参数)

模板的局限性

 当模板使用自定义的类名时,需要具体化模板

比如:template<> bool myCompare(Person &p1, Person &p2);

类模板

<>代表模板的参数列表、()代表形参

类模板与函数模板的区别

 

 

 类模板中成员函数的创建时机

 类模板对象做函数参数

 类模板与继承

 类模板成员函数的类外实现

 

 

 类模板的份文件编写

 类模板与友元

 STL(标准模板库)

 

 

 

 

 

 

 

 String容器

 

 

 

 

 

 

 

 vector容器

 

 

 

 

 

 

 

 deque容器

 

 

 

 

 

 

 

 

 stack容器

 

 queue容器

 

 

 list容器

 

 

 

 

 

 

 

 set容器

 

 

 

 

 

 

 

 

  仿函数

bool operator() ()

第一个()代表重载的符号、第二个()代表函数的参数列表

 map容器

 

 

 

 

 函数对象

 

 谓词

 内建函数对象

 

 

 

 STL中的常见算法

 

 

 

 

 

 

 

 

 

 常用排序算法

 

 

 

 常用的拷贝和替换算法

 

 

 

 

 

 常用的数据生成算法

 

 

 常用集合算法

 

 

 

 

 

 

 

;