1、C++指针和引用的区别
指针p:可以看做是一个对象,它有自己的地址(指针有自己在内存中的地址,所以有指向指针的指针),它内部可以存值(存的是指向的数据类型的值)。由于对象有常量和变量之分,所以指针也有常量和变量之分。常指针:所指向的变量地址是不可变的;指向常量的指针:指针所指向的数据类型是个常量,但是指针的指向是可以改变的。声明一个指针之后不用立即初始化,指针可以指向NULL。
引用:引用不是一个对象,它没有自己的地址,可以把引用看作是一个对象的别名。定义了一个对象之后,就必须初始化,不能指向NULL;并且一旦与一个值绑定之后,就不能再和其它值绑定在一起。
2、函数重载和函数重写的区别
函数重载:当函数就有相同的函数名,但参数列表的情形不相同时(参数的个数不同或者参数的类型不同),这样的同名不同参数的函数叫做函数重载。要注意的是:仅仅是返回值类型的不同,无法构成重载。它是C++多态性的一种体现。
函数重写:也被成为函数覆盖;是指子类重新定义虚基类(抽象类)中具有相同名称和参数类型的虚函数或者成员函数,主要是在继承关系中出现。(1)重写的函数和被重写的函数必须都为virtual函数,并分别位于基类和派生类中;(2)重写的函数和被重写的函数,函数名和函数参数必须完全一致;(3)重写的函数和被重写的函数,返回值相同,或者返回指针或引用,并且派生类虚函数返回的指针或引用的类型是基类中被替换的虚函数返回的指针或引用的类型的字类型。它也是C++多态性的一种体现。
3、对抽象类、virtual的使用和理解
抽象类,是指包含虚函数的类,它不能实例化对象,只能定义类的指针和引用,只能作为上层基类存在。用virtual声明的虚函数有两种:(1)普通虚函数(简称虚函数):有一个缺省实现;(2)纯虚函数:只有一个定义,没有具体实现。我对virtual的理解是:它是一种C++接口继承的方式。C++的继承方式有实现继承和接口继承;实现继承就是,继承父类中已经定义好的成员函数,通过创建子类的对象,传入不同的值去调用,无需额外的编码;另外一种是接口继承:是指只继承声明,具体的实现要子类自己去完成;通过抽象类中的virtual可以达到接口继承的效果。
4、说说面向对象的三个特征、以及你对它们的理解
(1)继承:让某个类型的对象获得另一个类型的对象的属性的方法;包括实现继承和接口继承;继承的过程是从一般到特殊的过程。
(2)封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。通过封装,可以对对象内部的数据设置不同级别的保护。
(3)多态:一个类的实例的方法在不同情形的使用下有不同的表现。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。’
5、抽象类与虚基类的区别
抽象类:包含有virtual虚函数的类
虚基类:虚继承主要用于一个类继承多个类的情况,避免重复继承同一个类两次或多次所产生的二义性问题。虚基类是相对于它的派生类而言的,它本身可以是一个普通的类。在直接派生类的继承语句中用virtual关键字。例如 由类A派生类B和类C,类D又同时继承类B和类C,这时候类D就要用虚继承的方式避免重复继承类A两次。
6、对静态数据和静态方法的理解
静态数据和静态方法是对于类而言的,是类的所有实例对象所共享的数据和方法,直接通过类来进行调用。在内存中,静态数据是不存在于类的实例对象中的,它不会重复产生,只在内存中保佑一块一直存储静态值,可以将它看成是相对于这个类而言的全局方法或者全局变量。