C++第二阶段知识(2)

类和对象
封装继承和多态
1.封装
整体性:属性和行为作为整体
权限(控制)性:对内容加以权限控制
struct和class的默认访问权限不同
class默认访问权限是私有,struct是公有
成员属性私有化:控制读写权限,检测写数据的有效性
2.构造函数和析构函数
2.1.构造函数:
类名(){} 可以有参数,可以重载
函数名和类名相同
2.2析构函数:
~类名(){} 不可以有参数,不可重载
函数名和类名相同
对象执行过程中自动调用构造和析构函数,都是必须的实现,编译器往往会补上(空实现)
2.3分类和应用
有参构造/无参构造(默认构造)
普通构造/拷贝构造(Person(const Person &p){})
调用方法:括号法(调用默认构造时,不要写空括号,编译器会当成空函数);
显示法;(匿名对象)
隐式转换法。(不要利用拷贝构造初始化匿名对象 ××× Person(p3)×××)
调用时机:1.用已创建的对象来初始化新对象2.值传递给函数参数传值3.值方式返回局部对象
结构赋初值:
结构体中 构造函数 Person(int a,int b,int c):m_a(a),m_b(b),m_c©{}:
2.4成员
2.4.1对象成员
类中成员是另一个类—对象成员
构造时先构造本类中其他类对象,再构造自己的类。析构时顺序相反。
2.4.2静态成员
static+成员变量和成员函数
静态成员变量:编译阶段分配内存/所有对象共享同一份数据/
类内(静态成员变量)声明,类外初始化
静态成员函数:静态成员函数可以访问静态成员变量,不可以访问非静态(::从属关系符号)
2.4.3对象模型
空对象创建后也占用内存(1)
成员变量和成员函数分开存储:
非静态成员变量 属于类对象 ;静态成员变量和函数,非静态成员函数 都不属于类对象
由上可知,非静态成员函数只生成一个函数实例,共用同一块代码
2.4.4 this指针
*this指向对象本体
this 本质是指针常量,指向不可修改
链式编程思想
2.4.4 常函数和常对象
常函数:在成员函数后面加const,修饰的是this指向,使得成员函数内部的值也不能修改
成员变量 +multable,可以使得在成员函数内可修改
常对象:对象前+const,常对象只能调用常函数,不可修改普通成员变量(multable除外),也不可调用不同成员函数
2.4.5友元(friend)
友元在声明后,可以访问声明过的对象的私有部分。
2.4.6运算符重载
1.成员函数重载 Person operator+ (Person &p)
2.全局函数重载 Person operator+ (Person &p1,Person &p2)
重载函数的返回值类型定义+&,是为了可以一直对一个数据操作(链式编程)
(定义++x,x++时 占位参数(int)用于区分前置后置)
(定义重载运算符函数时:后置递增返回值,前置递增返回引用)
各种运算符重载函数具体操作见自己写的类;运算符重载
仿函数:函数调用运算符”()“重载
匿名对象:对象() 对象+空括号 匿名对象在当前行执行完立即释放
3.继承
集成技术减少重复代码
3.1class 子类(派生类): 继承方式 父类(基类)
继承方式:公有继承,保护继承,私有继承
区别:子类不可访问父类的私有内容;三种继承不能扩大权限,只会缩小权限
sizeof:父类所有非静态属性全部被子类继承(父类私有内容被编译器隐藏)
(利用开发人员命令提示工具查看对象模型)
同名(静态/非静态)成员函数的调用:
直接调用时调用的是子类的同名成员,如果调用父类,需要加作用域:
3.2:多继承:二义性(父类之间同名组员);
菱形继承(钻石继承):二义性(同上)/继承了两份顶部数据,资源浪费
解决的方法:虚继承 class 子类 :virtual public 父类{};
vbptr 虚基类指针 (v虚 base 基)指向bvtable 虚基类表
继承两个指针 通过偏移量的不同,指向同一个地址数据

1.多态
静态多态:函数重载,运算符重载,函数名复用
动态多态:派生类,虚函数 实现运行时的多态
区别在于:静态多态在编译时确定函数地址(地址早绑定),
动态多态在运行时确定函数地址(地址晚绑定)
虚函数!
动态多态:条件1.有继承关系2.子类重写父类中的虚函数
调用:用父类的指针或者引用 执行子类对象
虚函数-虚函数指针(vfptr)-虚函数表(vftable)
虚函数表记录虚函数地址:
入口地址:&Animal::speak
子类中的虚函数表内部 会替换为 子类的虚函数地址
多态的好处:代码结构清晰;可读性强;利于维护。
开闭原则:对扩展进行开放,对封闭进行关闭。
纯虚函数和抽象类:
通常多态中,父类中虚函数的实现是毫无意义的,主要用于通常是调用子类重写 的内容。因此可以将虚函数改为纯虚函数
纯虚函数: virtual 返回值类型 函数名 (参数列表) = 0;
有了纯虚函数的类,也叫做抽象类
抽象类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值