C++基础篇--面向对象化设计

本文介绍了C++中的面向对象编程概念,包括封装、继承和多态。封装是将数据和操作这些数据的函数封装到对象中,以保护数据并提供访问途径。继承允许类从其他类继承特性,而多态则允许函数根据操作对象的不同表现出不同行为。此外,还讨论了运算符重载和类的访问控制(public、protected、private)。

目录

1、面向对象编程

2、封装、继承和多态

封装

继承

多态


1、面向对象编程

面向程序化设计(object-oriented programming.简称OOP):基本思想是把数据和操作这些数据的函数合并到一个简单的单元中,这样的单元被称为对象。对象中的函数称为成员函数,它提供了访问该对象数据的唯一途径。想读取数据就要调用函数,不能够直接访问数据,因为数据对外界不可见(避免数据被意外改变)。

将数据和它的函数装进一个实体,这被称为封装。

面向对象语言的特征:

1.对象。采用面向对象语言解决程序设计问题时,首先要考虑如何将问题划分为对象。用对象而不是函数来思考问题。典型的对现象类别:计算机用户环境中的部件(窗口,菜单,图形图像,鼠标,键盘,打印机),数据存储结构(自定义数组,堆栈,链表,二叉树),人类实体(雇员,学生,顾客,销售员)等

2.类 。在OOP中说对象是类的成员。类是许多相似对象的共同性描述(指出这个类的对象包含了哪些数据和函数)。定义类并不会创建任何对象,好比一张计划蓝图或图纸。

3.继承。在C++中,原始的类称为基类。其他的类定义时共享它的特征,也可以加入自己的特征,他们被称为派生类。派生类首先继承基类的特征,然后加上自己的特征。

4.可重用性。一旦一个类通过了编写,创建和调试各步骤,它就可以被分发给其他程序员,以便他们可以在各自程序中使用。与过程化语言中的函数库相似,这些库可被整合进不同的程序。

5.创建新的数据类型。对象的一个优点就是为程序员提供了构造新的数据构造类型的简单方法。

6.多态性与重载。运算符和函数可以有不同的执行方式,用哪一种取决于它所操作的内容,这称为多态性(同一种事物有截然不同的形式)。当已有的运算符(如+或-)被赋予操作新类型的能力,就被称为重载。

C语言是面向过程语言(程序中每条语句均是对计算机的指令)采用结构化程序设计。

结构化程序设计出现的问题:1.函数能够无限制的访问全局变量。2.函数与数据之间缺乏联系,面向过程范型为现实世界提供了一个粗劣的模型。

2、封装、继承和多态

封装

  1. 将成员和行为用class放在一起的动作,并赋予其权限的行为,叫做封装。
  2. 两个关键点:既有成员函数又有成员变量,二是有权限控制。
  • public:类内类外皆可访问
  • protected:父类子类可访问,其他类不可访问
  • private:只有类内可访问,类外不可。friend关键字也可访问

私有化的好处:控制关键变量的写读权限,对变量的写入值的有效性增加校验的空间。

struct和class的区别:默认的访问权限不同,前者是public,后者是private。

继承

  1. class A:public B
  • A  子类,派生类   B父类,基类
  • 减少重复代码
  1. 继承方式

public 只能继承父类public属性成员

protected可以继承父类public和protected属性成员,且在子类中的成员属性为protected,类内可以访问,类外不行

private可以继承父类中public和protected属性成员,且在子类中成员属性为private

均不可访问父类的私有空间。

  1. 继承内容

父类中所有成员均会被继承,private属性被编译器隐藏。

  1. 同名成员处理

子类中的成员直接调用,父类中的成员需要+父类作用域访问。子类中存在和父类中同名的成员函数时,会隐藏所有的父类中的该名字的成员函数。若想调用父类中该名字的成员函数,加作用域访问即可。

static处理方式和非static一致。有两种访问方式,通过对象和类名。

  1. 多继承

一个子类继承多个用逗号隔开的父类。

若是父类中有同名的属性,用作用域区分。

  1. 菱形继承

问题一:多个同名属性,用作用域解决

问题二:资源浪费,用virtual虚继承解决,在虚基类表

多态

如其字面意思,多种形态。可分为静态多态和动态多态。

静态多态:函数重载和操作符重载,地址早绑定。

动态多态:函数地址不提前绑定,在运行时确定函数调用地址。地址晚绑定。函数在子类中重写。父类的指针或引用指向子类。

动态多态的底层原理:

1-父类中对含有virtual函数会有一个vfptr指向虚函数表,用vftable来管理,子类继承父类时继承这个vftable

2-子类中若是重写了virtual函数,会在子类的vftable中更新虚函数的地址

运算符重载:

对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

运算符重载也可以进行函数重载,operate操作符就是函数名。

格式:返回值类型  operate重载的运算符(参数arg)

注意:

  1. 内置的数据类型的运算符不可以重载,比如int,float等
  2. 不要滥用运算符重载

  • 成员函数运算符重载

person operate+(person &p2);

person p3 = p1.operate+(p2)

====

person p3 = p1 + p2;

  • 全局函数运算符重载

person operate+(person &p1, person &p2);

person p3 = operate+(p1, p2);

====

person p3 = p1 + p2;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值