C++面相对象三大特性

本文详细介绍了C++的面向对象特性,包括封装、继承和多态。封装强调对象的自我完整性,继承允许子类继承父类的属性和行为,而多态则使得不同对象能响应相同的消息。文章还讨论了虚函数在实现多态中的作用,以及构造函数和析构函数的使用。此外,对比了C++和C#中多态的实现方式,并探讨了抽象类与接口的区别。
摘要由CSDN通过智能技术生成

封装

【封装复杂,对外留出简单接口】
封装是在设计类的一个基本原理,是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与对数据进行的操作进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装是一个抽象的模型,该模型对外提供服务,而任何使用该模型的用户不需要知道模型是如何运作的。


那么设计这个类的时候需要考虑的事情就是:
1、 这个类是哪个对象的抽象
2、 这个类需要使用那些数据【数据】
3、 需要怎么来操作这些数据【属性方法】
4、 数据和属性方法是否可由外界访问【访问权限】


C++类中成员变量初始化
对于普通变量 ,有5中方法
第1种,在无参数的构造函数中初始化;
【构造函数中赋值】
第2种,带参数的构造函数中初始化;
【构造函数中赋值】
第3种,直接给成员变量赋值;
【使用类对象时,用对象名.变量名=*** 赋值】
第4种,调用成员函数来初始化成员变量;
【在类中某个方法中赋值,实质同方法一、二】
第5种,用this指针;
【当类中方法定义在类外面时,在变量名前用this->来确定这个变量是类中的】

对于非普通变量
static 静态变量:
static变量属于类所有,而不属于类的对象,因此不管类被实例化了多少个对象,该变量都只有一个。在这种性质上理解,有点类似于全局变量的唯一性。
【类外进行初始化】
const常量
【需要在声明的时候即初始化。因此需要在变量创建的时候进行初始化。一般采用在构造函数的初始化列表中进行。】
Reference 引用型变量
【引用型变量和const变量类似。需要在创建的时候即进行初始化。也是在初始化列表中进行。但需要注意用Reference类型。】

继承

访问权限
public: 所有都能访问
protected:成员可以被派生类对象访问但不能被该类型的普通用户访问
pravate:只能由基类的成员和友元访问

protected成员:可以看成是private和public的混合
像private成员一样,protected成员不能被类的用户访问
像public成员一样,protected成员可被该类的派生类访问

基类的protected可以被其派生类访问,派生类protected不能被其基类访问

没有继承的时候,类只有两种用户:类本身和该类的用户
Public和private就是为了区别这两种用户的权限

有了继承之后,有了第三种用户,用类派生新类的程序员,这时候,如果基类中需要让派生类访问,但不让外界访问的这种权限,就叫protected

经过继承后权限的变化



派生类定义方法:

Class classname: ccess-lable base-class

每个派生类对象都有基类的部分。

如果要声明一个派生类,则声明包含类名但不包含派生列表,例如:下面的前向声明会导致编译错误:
Class Bulk_item: public item_base;
正确的前向声明应该是:
Class bulk_item;
Class item_base;

友元关系不能继承,基类的友元对派生类的成没有特殊访问权限,如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。【友元可以访问private 和protected】
一个类A中对另一个类B或一个函数b声明友元,那么B或者b就可以访问A中的私有成员和保护成员。



在继承的过程中需要遇到几个概念:重载(overload),重写(override,也称覆盖), 重定义(redefine,也称隐藏)
一、 重载(overload)【根据实参的不同,调用不同的参数】
指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;
二、重写(也称为覆盖 override)【基类和子类对于同一个方法有不同的实现】
是指派生类重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…
(6)重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的
三、重定义(也成隐藏)【用的比较少】
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值