C++之类小结

面对对象:面对将系统看成通过交互作用来完成特定功能的对象的集合。每个对象用自己的方法来管理数据。也就是说对象内部的代码能够操作对象内部的数据。

类的特性:抽象、封装、继承、多态。

(1)抽象性:表示同一类事物的本质;类是对象的抽象,对象是类的特例,即对象是类的具体表现形式。

(2)封装性:就是将某些东西包装盒隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。其目的是增强安全性和简化编程,使用者不必了解功能具体的实现细节,而只是通过外部接口以及特定的访问权限来使用类的成员。
这就涉及到类的访问限定符了:private/public/protected。

(3)继承性:它是面向对象的一个重要概念,如果类B继承来至A,就把类B称为"“A的子类”,把A称为"“B的父类”。继承这一特性,可以使子类具有父类父类的各种属性和方法,而不需要再次编写相同的代码,在令子类继承父类的同时,可以重新定义某些属性,并重新某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。
  继承是指一个对象直接使用另一个对象的属性和方法,事实上我们遇到的很多事物都有继承的含义,例如,若把动物看做一个实体,他可以分成很多个子实体,如:猫、狗、鸡等等,这些字实体都具有动物的特性,因此,动物是它们的“父亲”,而这些子实体则是动物的“孩子”。
继承也会涉及访问限定符。

(4)多态性:多态可以使我们以相同的方式处理不同类型的对象,我们可以使用一段代码处理不同类型的对象,只要他们继承/实现了相同的类型。这样我们没有必要为每一种类型的对象编写相同的逻辑,极大的提高了代码的重用。其实,用简单的一句话来形容就是:多态性,允许将子类类型的指针赋值给父类类型的指针,多态性在C++中是通过虚函数实现的。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”,或者称为“重写”。子类重写父类中虚函数时,即使不用virtual声明,该重载函数也是虚函数。详细介绍:https://www.cnblogs.com/dormant/p/5223215.html

(2)限定符介绍:

(1)private:类中函数可见、友元函数可以访问,不能被任何其它访问,该类的对象也无法直接访问

(2)protected:类中函数可见、子类的函数可见、友元函数可见,该类的对象无法直接访问

(3)public:类中函数可见、子类可见、友元函数可见、类对象也可见。

友元函数包括两种:友元全局函数、友元类中的成员函数。

(3)继承中涉及的权限问题

 A类(基类)B类(A的派生类)C类(B的派生类)
公有继承公有成员公有成员公有成员
私有成员(无)(无)
保护成员保护成员保护成员
私有继承公有成员私有成员(无)
私有成员(无)(无)
保护成员私有成员(无)
保护继承公有成员保护成员保护成员
私有成员(无)(无)
保护成员保护成员保护成员

(4)覆盖与重载

无论在类作用域内还是外,两个(或多个)同名的函数,可能且仅可能是以下三种关系:重载(Overload)、覆盖(Override)和隐藏(Hide),因为同名,区分这些关系则是根据参数是否相同、是否带有const成员函数性质、是否有virtual关键字修饰以及是否在同一作用域来判断。

(1)覆盖

真正的多态行为,通过虚函数来实现,所以,编译器根据以下依据来进行判定两个(注意只可能是两个,即使在继承链中,也只是最近两个为一组)函数之间的关系是覆盖:

(1)不同的范围:即使用域,两个函数分别位于基类和派生类中

(2)函数名字相同(基本前提)

(3)函数参数也相同(基本前提),第(2)和第(3)点统称“函数特征标”相同

(4)基类函数必须用virtual关键字修饰

即“不同的范围,特征标相同,且基类有virtual声明,发生覆盖“。

(2)重载
如果不在类作用域内进行讨论,两个(或多个)同名函数之间的关系只可能是重载或隐藏。相同函数名但参数不同,返回类型不会对是否重载有任何影响。重载是编译期绑定的静态行为,不是真正的多态性

有以下判定依据:

(1)相同的范围:即作用域,这里指在同一个类中,或同一个名字空间,即C++的函数重载不支持跨越作用域进行,这也是区别重载和隐藏的最重要依据。

(2)函数名字相同(基本前提)

(3)函数参数不同(基本前提,否则在同一作用域内有两个或多个同名同参数的函数,将产生ambiguous,另外注意,对于成员函数,是否是const成员函数,即函数声明之后是否带有const标志,可理解为“参数不同“),第(2)和第(3)点统称“函数特征标”不同

(4)virtual关键字可有可无不产生影响(因为第(1)点已经指出,这是在同一个类中)

即"相同的范围,特征标不同(当然同名是肯定的),发生重载"。

(3)隐藏

(1)如果派生类函数与基类函数同名,但参数不同(特征标不同),此时,无论是否有virtual关键字,基类的所有同名函数都将被隐藏,而不会重载,因为不在同一个类中;

(2)如果派生类函数与基类函数同名,且参数也相同(特征标相同),但基类函数没有用virtual关键字声明,则基类的所有同名函数都将被隐藏,而不会覆盖,因为没有声明为虚函数。

即“不同的范围,特征标不同(当然同名是肯定的),发生隐藏”,或“不同的范围,特征标相同,但基类没有virtual声明,发生隐藏“。

可见有两种产生隐藏的情况,分别对应不能满足重载和覆盖条件的情况。

对象

对象是类的特例。有两要素:属性和行为;

属性对应于对象的数据;行为对应于函数;

对象之间可以通过一定的渠道相互联系;要使某一个对象实现某一种行为(操作),应当向它传送相应的消息。

类的组成

(1)构造函数:https://blog.csdn.net/thecentry/article/details/80556126

(2)析构函数

(3)成员函数

(4)友元函数

(5)成员变量

(5)成员变量初始化

(1)成员被初始化的次序就是定义成员的次序,跟初始化列表中的顺序无关。

(2)初始化 const 或引用类型数据成员的唯一机会是构造函数初始化列表中,在构造函数函数体中对它们赋值不起作用。

(3)没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数。

(4)不能包含本类的对象,但能包含该类的指针对象。

(6)static成员

1 static 成员变量

static 数据成员是与类关联的对象,并不与该类的对象相关联。

static 成员遵循正常的公有/私有访问规则。

2 使用 static 成员而不是全局对象有三个优点

(1) static 成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。

(2) 可以实施封装。static 成员可以是私有成员,而全局对象不可以。

(3) 通过阅读程序容易看出 static 成员是与特定类关联的,这种可见性可清晰地显示程序员的意图。

3 static 成员函数

在类的内部声明函数时需要添加static关键字,但是在类外部定义函数时就不需要了。

因为static 成员是类的组成部分但不是任何对象的组成部分,所以有以下几个特点:

static 函数没有 this 指针

static 成员函数不能被声明为 const (将成员函数声明为 const 就是承诺不会修改该函数所属的对象)

static 成员函数也不能被声明为虚函数

4 static 数据成员

static 数据成员可以声明为任意类型,可以是常量、引用、数组、类类型,等等。

static 数据成员必须在类定义体的外部定义(正好一次),并且应该在定义时进行初始化。

5 特殊的静态常量整型成员

静态常量整型数据成员可以直接在类的定义体中进行初始化,例如:

static const int m_iNum = 9;

类之虚函数、动态联编 :
https://blog.csdn.net/haoel/article/details/1948051/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值