数据结构与算法 C++基础知识总结

函数重载与复写

1.成员函数重载特征:
a、相同的范围(同一个类中)
b、函数名字相同
c、参数不同
d、virtual关键字可有可无

不能被重载的运算符

1、.(成员访问运算符)
2、.* (成员指针访问运算符)
3、:: (域运算符)
4、sizeof(长度运算符)
5、?: (条件运算符)

重写(覆盖)是指派生类函数覆盖基类函数,特征是:

a、不同的范围,分别位于基类和派生类中
b、函数的名字相同
c、参数相同
d、基类函数必须有virtual关键字
3、重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则是:
a、若派生类的函数和基类的函数同名,但参数不同,此时不管有无virtual,基类的函数被隐藏
b、若派生类的函数和基类的函数同名,且参数相同,但基类没有virtual关键字,基类的函数被隐藏

虚函数

虚函数必须是类的一个成员函数,不能使友元函数,也不能是静态的成员函数。(静态成员函数在内存中只有一份,而虚函数必须根据类来确定调用那个虚函数 一个归属于类 一个归属于对象)
析构函数可以定义为虚函数,但不能将构造函数定义为虚函数。(构造函数是用来建立对象的,而虚函数的使用是建立在对象的基础上的 构造函数为虚函数就不能调用了)

抽象类与纯虚函数

抽象类指的是含有纯虚函数的类,该类不能建立对象,只能声明指针和引用,用于基础类的接口声明和运行时的多态 ,在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

多态继承和虚函数的知识

通过继承和虚函数实现运行时多态。
运行时多态的基础是基类指针,基类指针可以指向任何派生类对象,基类指针是指向子类的。(只有通过基类指针来实现多态)。
在基类中的某成员函数被声明为虚函数后,在之后的派生类中可以被重新定义。但在定义时,其函数原型,包括返回类型、函数名、参数个数和参数类型的顺序,都必须与基类中的原型完全相同。只要在基类中显式声明了虚函数,那么在之后的派生类中就不需要用关键字virtual来显式声明了,可以略去,因为系统会判断是不是虚函数。所以,派生类中的虚函数如果不显式声明也还是虚函数。
当使用虚函数时,派生类必须是基类public派生的。定义虚函数时,不一定要在最高层的类中 ,而是看在需要动态多态性的几个层次中的最高层类中声明虚函数。

内联(inline)函数

不能是虚函数,因为内联函数是不能在运行中动态确定其位置的,即使虚函数在类内部定义,编译时将其看作非内联。

友元函数

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数,友元函数 没有this指针 所以需要引用对象名
一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
使用友元函数注意的要点:
1、类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,不需要加类限定。
2、一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。
3、友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用。
4、友元函数在调用上同一般函数一样,不必通过对对象进行引用。

继承方式与成员权限

公用(public):访问权限最高;除派生类外,外部函数也可以直接访问(无论是成员变量还是成员函数)。
私有(private):访问权限最低;只能是该类内部函数互相调用,派生类、外部函数都不能访问。
保护(protect):访问权限中间;该类内部函数、派生类都能访问,外部类、外部函数不能访问
如果非要在派生类中使用基类的私有成员,使用友元类或友元函数。

C++中的继承方式有:

(1) public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。
(2) private(私有继承):继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。派生类的成员(定义时的类)也只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
(3) protected(保护性继承):继承时基类中各成员属性均变为protected,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。

静态数据成员可以被private之类的修饰作用,被private修饰之后,只有类的友元和成员函数可以访问。
静态数据成员可以被类的对象调用。
static数据成员必须在类体之外进行定义。通常在定义时才进行初始化。
class Base{
static int a;//注意类中只是声明 只有实例化对象是才有定义初始化
};
Base::a=5;

成员函数与内联函数

内联函数不用压栈出栈速度快,比宏定义安全(宏定义不会进行类型检查)
内联函数在编译时展开,而宏在预编译时展开
inline函数一般用于比较小的,频繁调用的函数,这样可以减少函数调用带来的开销。

有两种内联函数的声明方法,
一种是在函数前使用inline关键字;
另一种是在类的内部定义函数的代码,这样的函数将自动转换为内联函数,而且没必要将inline放在函数前面。(定义在类内的就是隐式内联)
(1)类中声明 类外定义inline
(2)类中声明Inline 类外定义
(3)类中声明 类外定义(一定不是内联函数)
(4)类中声明并定义(没有inline)

const和static数据成员

普通数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表中初始化
Static数据成员必须在类外初始化,不能在构造函数或构造器中初始化
const数据成员只能在构造函数的初始化列表中初始化;或者直接类内直接赋值
const static数据成员可以在类内初始化 也可以在类外,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值