基础编程
内存分区
- 代码区:存放函数的二进制代码,由操作系统进行管理
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配和释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不分配释放,则由操作系统回收
new操作符
在堆区开辟数据,返回时数据对应的类型指针,释放用delete。
引用
- 本质是一个指针常量,指向的内容不可改变
- 给变量起别名:数据类型 &别名 = 原名
- 引用在初始化后不可修改
- 引用可以作为函数调用的左值(可以返回一个局部变量)
函数占位参数
在定义函数时,形参可以使用int之类的数据类型占用一个位置
函数重载
- 可以提高代码的复用性
- 必须在同一个作用域下,函数名称相同,函数参数的返回类型、参数个数、参数顺序至少一个不同
- 改变函数的返回值不是重载
访问权限
- pubilc:全局访问
- protected:类内可访问,类外不可访问(父类中的protected内容,子类可以访问)
- private:类内可访问,类外不可访问(父类中的private内容,子类不可以访问)
构造函数与析构函数
构造函数:在创建对象时为对象的成员属性赋值,构造函数由编译器自动调用
如果用户定义了有参构造函数,C++将不在提供默认无参构造,但会提供默认拷贝构造
如果用户定义了拷贝构造函数,C++不会提供其它的构造函数
按参数分类
- 有参构造
- 无参构造
按类型分类
- 普通构造
- 拷贝构造(使用一个创建完毕的对象初始化一个新的对象,使用值传递的方式返回)
调用方式
- 括号法
- 显示法
- 隐式转换法
析构函数:在对象销毁前自动调用,执行清理工作
深拷贝与浅拷贝
浅拷贝:简单的赋值操作
深拷贝:在堆区重新申请内存空间,进行拷贝操作
初始化列表
构造函数():属性1(值1),属性2(值2)...()
可以加快属性的初始化
静态成员变量
- 不属于某个对象上,所有对象都共享同一份数据,类内生命、类外初始化(用::初始化),访问方式:通过对象进行访问(对象.成员)、通过类名进行访问(类名::成员)
- 类外访问不了私有成员变量
静态成员函数
- 所有对象共享一个函数
- 静态成员函数只能访问静态成员变量(无法区分非静态成员变量的归属)
- 类外访问不了私有静态成员函数
成员变量与成员函数时分开存储的
- 空对象占用的内存空间为1(编译器为了区分各个对象在内存中的占用位置),每个空对象应该有一个独一无二的内存地址。
- 非静态成员变量,属于类的对象上;静态成员变量不属于类的对象上;(非)静态成员函数,不属于类对象。
this指针
- 本质是指针常量,指针的指向是不允许修改的,指针指向的值是可以修改的
- this指针指向被调用的成员函数所属的对象(哪个对象调用,this就指向哪个)
- this无需定义,直接使用
- 用途:当形参和成员变量同名时,可以用this指针区分;在非静态成员函数中返回对象本身,可以用teturn *this(返回值要用引用的方式传递:类&,不会创建新的对象,如果直接返回类,会自动调用拷贝构造函数创建新的对象)
空指针
空指针所创建的对象无法访问成员变量
常函数与常对象
- 在成员变量后加const,修饰的是this指向,则其指向的值不可修改
- 如果需要修改需要在定义前加入关键字mutable
- 常对象与常函数的特点基本一致
注意:常对象只能调用常函数
友元
目的是让一个函数或类访问另一个类中的私有成员
friend
全局函数做又元
在声明类的第一行做一个函数声明,函数前加一个关键字friend
类做又元
在声明类的第一行做一个类声明,类前加一个关键字friend
全局函数做又元
在声明类的第一行做一个全局函数声明,全局函数前加一个关键字friend
运算符重载
使用operator+
继承
继承中父类和子类的构造和析构的顺序
继承中同名成员处理方式
直接调用,访问的是子类成员,如果通过子类对象访问父类的成员,需要加父类作用域
菱形继承
当两个父类拥有相同的属性时,需要加以作用域区分
多态
如果想运行子类的方法,则需要在运行阶段才绑定地址,使用vitual关键字
动态多态的满足条件
- 有继承关系
- 子类重写父类的虚函数
- 使用父类的指针或引用,执行子类的对象
重写概念:函数返回类型、函数名、函数参数列表完全一致
多态的底层原理
虚函数的出现,将会导致类的内部发生改变,生成了一个虚函数表指针,其指向了虚函数的函数入口地址,当子类重写了虚函数的时候,子类中虚函数表 内部 会替换成 子类的虚函数地址
对文件的操作
- ofstream 写操作
- ifstream 读操作
- fstream 读写操作
文件打开方式可以配合使用,利用 | 操作符
读文件
二进制文件读写
写文件
读文件
高级编程
模板-泛型编程
自动类型推导
function(参数)
显示指定类型
function<类型>(参数)
注意事项
普通函数与函数模板的区别
普通函数和函数模板的调用规则
使用空模板的参数列表强制调用函数模板
function<>(参数)
模板的局限性
当模板使用自定义的类名时,需要具体化模板
比如:template<> bool myCompare(Person &p1, Person &p2);
类模板
<>代表模板的参数列表、()代表形参
类模板与函数模板的区别
类模板中成员函数的创建时机
类模板对象做函数参数
类模板与继承
类模板成员函数的类外实现
类模板的份文件编写
类模板与友元
STL(标准模板库)
String容器
vector容器
deque容器
stack容器
queue容器
list容器
set容器
仿函数
bool operator() ()
第一个()代表重载的符号、第二个()代表函数的参数列表
map容器
函数对象
谓词
内建函数对象
STL中的常见算法
常用排序算法
常用的拷贝和替换算法
常用的数据生成算法
常用集合算法