经过一个学期C++课程的理论学习及多次课程实验,我对C++有了深刻的认识。以下是对几个概念的认识简述:
- 局部静态变量的特点
虽然之前在编程时对“局部变量,全局变量,静态局部变量,静态全局变量”这四个“变量"就有不少困惑,但一直没去细究,今天决定将其弄清楚。
静态局部变量:在一个函数中定义局部变量时,若加上static声明,则此变量为静态局部变量,在静态存储区分配存储单元,在程序运行期间都不释放。
1.静态局部变量只能在该函数中使用;在函数调用结束后不自动释放,保留函数调用结束后的值;不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。
2.静态局部变量在编译时赋值,只会初始化一次
静态属性只能被初始化为一个字符值或一个常量,不能使用表达式(若在定义时未进行赋值处理,则默认赋值为0 (对数值型变量)或空字符(对字符型变量) ) ;
3.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
- 类的继承和类的组合的区别
组合是在一类类中引用另一个类。生成另一个类的实例;而继承只是继承了父类的变量和方法。
使用组合可以用到另一个类中私有的变量和方法,而继承就不可以用到父类的
私有的变量和方法了。
组合关系是局部类和整体类的关系。
包括:从整体类到局部类的分解过程,从局部类到整体类的组合过程。
继承关系是父类和子类的关系。
包括:从子类到父类的抽象过程,从父类到子类的扩展过程。
组合和继承是面向对象中两种代码复用的方式。
组合是指在新类里面创建原有类的对象,重复利用已有类的功能。继承是面向对象的主要特性之一,它允许设计人员根据其它类的实现来定义一个类的实现。
组合和继承都允许在新的类中设置子对象(subobject):只是组合是显式的,而继承则是隐式的。
组合和继承存在着对应关系:组合中的整体类和继承中的子类对应,组合中的局部类和继承中的父类对应。
- 一般成员函数和静态成员函数的特点
静态成员函数
1.出现在类体外的函数定义不能指定关键字static;由于静态成员函数没有传递this指针,故static member function 只能访问static成员,不能访问非static 成员。但是非static却可以访问static 成员。
2.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;
3.静态成员函数不能访问非静态成员函数和非静态数据成员;
4.由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度.上会有少许的增长;
5.静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。
- 函数重载、同名隐藏和覆盖
C++的函数重载,覆盖和隐藏是三个比较容易混淆的概念。
函数的重载是指C++允许多个同名的函数存在,但同名的各个函数的形参必须有区别:形参的个数不同,或者形参的个数相同,但参数类型有所不同。函数重载发生在非成员函数之间和类的成员函数之间。非成员函数和成员函数之间不会发生重载,因为函数的作用域不同。
1.重载的特征:
a).几个函数如果是重载,那么他们的作用域相同,即在同一个范围内。【如:在同一个类中,或者在同一个全局中】
b).函数名字必须相同,但是参数必须不同【个数可以不同,类型也可以不同】
c).virtual关键字可有可无。
小结:【重载的作用就是同一个函数有不同的行为】
函数覆盖发生在子类和父类之间,函数的名称和签名都相同,并且父类函数必须有virtual关键字。对于C++来讲函数覆盖才是实现多态的手段,而重载和隐藏都不是。
2.覆盖的特征:
a).覆盖指的是派生类的函数覆盖基类的函数,因此范围不同,一个是在基类,一个是在派生类中。
b).函数名字和参数都必须完全相同。
c).virtual关键字必须出现在基类的函数中。
小结:【所谓的覆盖指的是:用基类对象的指针或者引用访问虚函数时会根据实际的类型决定所调用的函数】
3.隐藏是指派生类的函数屏蔽了与其同名的基类函数,
- 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
- 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
总结:函数的覆盖发生在派生类与基类之间,两个函数必须完全相同,并且是虚函数。不属于这种情况的,就是隐藏了。
- 纯虚函数、虚函数、非虚函数的区别及使用场景
纯虚函数:
纯虚函数只有函数名而不具备函数的功能,不能被调用。
纯虚数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。
虚函数:
处理的是不同派生层次上的同名函数问题;纵向重载。同一类族的虚函数的原型是相同的。
两者最基本的差别:
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数
纯虚函数在基类中是没有定义的,必须在子类中加以实现
纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。
非虚函数:
非虚成员函数表明了一种特殊性上的不变性,它表示的是不会改变的行为
声明非虚函数的目的在于,使派生类继承函数的接口和强制性实现。(所有的派生类都应该完成的使用该函数完成某一个功能)
使用场景:
1.在不使用多态时,使用非虚函数。
2.在使用多态时,即 使同一个函数名的函数具有不同的功能时,实现方式需要派生类自己重载时,(在派生类不重载时提供缺省值),使用虚函数。这样可以根据需要选取不同的执行方式,
3.在使用多态时,实现方法需要派生类自己重载时,(在派生类不重载时编译器报错),使用纯虚函数。