面试官问了两个c++的基础问题,但奈何太久没有看c++理论,几乎全忘记了。
现在朝花夕拾,重新温习一遍:
- c++ 指针和引用的区别
- 虚函数和纯虚函数的区别和应用场景
c++ 指针和引用的区别
《c++ primer》P47
1.指针本身就是一个对象,允许对指针赋值和拷贝,在指针的生命周期内它可以先后指向不同的对象
2.指针无需再定义时赋初值,如果没有初始化,是一个不确定的值
《c++ primer》P49
1.指针和引用最重要的一点是,引用并非是一个对象,一旦定义了引用,就无法令引用绑定其他对象,每次访问引用都是访问它最初绑定的对象
2.指针和其他变量一样,是一个对象,存放的地址。地址指向其他对象。
其他:
void* 指针(P50):可以存放任意类型的对象的地址,限制有: 因为不清楚指针指向的数据类型,
不能操作void指向的对象。但可以和别的指针比较、做输入输出、赋值给另一个void 指针。
指向指针的指针:**表示指向指针的指针,
指向指针的引用:因为引用不是对象,所以没有指向引用的指针
int *p; //int 指针
int *&r = p; //引用r指向指针p
虚函数和纯虚函数的区别
《c++ Primer》P537 + 自己理解
虚函数和非虚函数:虚函数对象的类型是不知道的。直到执行时才会决定执行的版本(基类或派生类);非虚函数对象的类型是确定的,在编译时就绑定到执行的版本上。所以非虚函数的地址对编译器来说“静态”的,实例地址只是个this指针参数。而虚函数的地址,是先到实例的地址前面去查找它的虚函数表所在的地址,是“动态的”地址。
虚函数:虚函数有定义,子类可以覆盖或不覆盖虚函数。继承类中如果覆盖虚函数,形参类型和返回类型必须一致。如果继承类中有形参不一样名字一样的函数,编译器认为这是两个独立的函数。
虚函数和重载函数:重载函数的形参和返回类型上一定和父类的不同,而虚函数严格要求返回类型和形参皆一致
纯虚函数:含有纯虚函数的类是抽象类。抽象类只负责定义接口,不能被定义。继承抽象类的子类需要重新纯虚函数,才能被定义,不然仍然是抽象类。
虚函数和纯虚函数:虚函数有定义(为空也可以)子类不一定要实现虚函数;纯虚函数没有定义,子类一定要实现纯虚函数
虚函数作用:虚函数实现多态性,即子类和父类的是同一个函数,同一个形参,同一个返回类型,但结果不同。
纯虚函数作用:目的是为了接口。对应在java中,定义抽象类的语法是 abstract class,也就是在类的一级作指定。用作基类使用