一、对象和变量
变量 :开辟内存
对象 :开辟内存+初始化
封装 :将属性和实现细节隐藏起来,对外提供公有的接口进行访问
访问限定符:
Public:任意位置
Protected:本类+子类
private:本类
属性一般私有 行为一般公有
通过公有的行为访问私有的属性 属性一般通过访问限定符
类成员方法的调用约定 :this_call
this指针指向对象的内存空间 访问对象下的成员变量
二、类中默认的函数:
没->系统提供 提供->系统不提供
1.构造函数
初始化对象所占的内存 赋予资源
- 可以重载 ,实参决定了调用那个构造函数。可以有多个
- 函数名与类同名,无返回类型
- 不能用const来修饰,因为const修饰的是this指针,加上const之后就无法对对象的值进行赋值。
- 构造函数不能用static修饰,因为静态函数没有this指针
- 构造不依赖对象调用,即不能手动调用,只能系统调用
- 新对象被创建,由编译器自动调用,且在对象的生命期内仅调用一次
2.析构函数
释放对象所占资源 <构造、析构都有this指针指向,对象都不完整>
- 析构函数在类名(即构造函数名)加上字符~。
- 析构函数无参数无返回值。
- 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。
- 对象生命周期结束时,C++编译系统系统自动调用析构函数。
- 注意析构函数体内并不是删除对象,而是做一些清理工作。
- 不可重载
- 析构依赖对象,也可以手动调用
析构函数会 退化成普通函数的调用 调用两次? 手动调用 系统调用
3.拷贝构造函数
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰)
- 特殊的构造 函数名与类名相同
- 拿已存在的对象生成一个相同类型的新对象
- 若不是引用 形参传实参是初始化,调用拷贝构造,一直递归,栈溢出
- 形参 一定要引用,避免递归调用生成形参对象 最终栈溢出程序奔溃
- 拷贝构造的形参必须是引用,因为引用不生成新对象
4.赋值运算符的重载函数 返回类型 operate 操作符 (参数列表)
用已存在的对象给相同类型的已存在的对象赋值
- 返回值 类类型的引用 为了能够连续赋值
- 自定义类型 一般用引用传参 内置类型 传值
- 默认的拷贝方式是浅拷贝,会让两个指针指向同一块堆内存
- 释放时,释放野指针,程序奔溃 内存泄漏
- 有了指针类型需考虑深拷贝
- 自赋值
- 释放旧的资源
- 开辟新的资源
- 赋值
不可以被重载的操作符有:
- 成员选择符(.)
- 成员对象选择符(.*)
- 域解析操作符(::)
- 条件操作符(?:)
(除了赋值号=之外,基类中被重载的操作符都将被派生类继承)
5.取地址操作符的重载函数
6.const修饰的取地址操作符的重载函数
关于const修饰类成员:
- const修饰形参,一般和引用同时使用
- const修饰返回值
- const修饰类数据成员,必须在构造函数的初始化列表中初始化
- const修饰类成员函数,实际修饰隐含的this,表示在类中不可以对类的任何成员进行修改
- 在const修饰的成员函数中要对类的某个数据成员进行修改,该数据成员定义声明是必须加mutable关键字
- const对象不可以调用非const成员函数。
- 非const对象可以调用非const成员函数和const成员函数 。
- const成员函数内可以调用其它的const成员函数。
- 非const成员函数内可以调用其它的const成员函数非const成员函数。
三、临时量
- 内置类型的临死量 常量
- 自定义类型的临时量 变量
- 隐式生成临时对象 常量
四、生存周期
表达式结束
优化:
临时对象的生成目的 生成临时对象
以生成临时对象的方式生成新对象
引用可以提升对象的生存周期
对象的生成一定遵循先构造后析构? 不是 new在堆上
五、static
static 修饰成员变量
- 不属于对象,属于类作用域 变量存在静态区,被堆中的对象所共享
- 一定要在类外初始化
static修饰局部变量
- 对该变量初始化一次
- 该变量在程序中只有一份内存
- 该变量的作用域不会改变
- 该变量的生命周期被延长,直到程序结束才销毁
static关键字修饰全局变量
- 该变量的作用域仅限于当前文件,工程中的其他文件不可以访问到该全局变量。
static 修饰成员方法
- _cdecl 没有this指针 不依赖对象调用
- 不能调用普通的类成员
六、模板 C++泛型
- 函数模板 用于生成函数
模板的实例化 :真实类型替换虚假类型的过程
模板的实参推演
- 有实参
- 不能产生二义性
模板的特例化优调用先级>模板的版本
模板需要精确匹配
2.类模板 用于生成类
模板的编译
- 定义点 模板头部
- 调用点 模板函数
<>模板参数列表
- 类型参数 typename | class
- 非类型参数 int SIZE
- 常量
- 不能是浮点型