c++面经积累<2>

4、类成员初始化方式:列表初始化和赋值初始化

赋值初始化通过在函数体内进行赋值,列表初始化,在构造函数后面加上冒号,使用初始化列表进行初始化。在函数体内进行初始化,是在所有的数据成员被分配内存空间后进行的,而列表初始化是在给数据成员分配内存空间的时候就进行初始化。两者的关系是先后的问题,一个是先分配,在初始化。另外一个是同时。

5、类如何实现只静态分配或者只动态分配

    1. 建立对象的方式:
      • 静态建立:静态建立一个对象,编译器为对象在栈空间上分配内存。
      • 动态建立:A *p = new  A(),动态建立,在堆上,使用new运算符为对象在堆空间中分配内存。然后调用构造函数构造对象。
    2. 因为对于前者,将new和delete设置为私有的,后者把构造函数和析构函数设置为protected属性。

6、什么情况会自动生成默认构造函数

  • 带有默认构造函数的类成员对象
  • 带有默认构造函数的基类
  • 带有虚函数的类或i这虚基类的类

7、抽象基类为什么不能创建对象

  • 抽象类:带有纯虚函数的类。
  • 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出,如果派生类没有对重写虚函数,那么派生类仍然是个抽象类,那么它仍然不能实例化对象。抽象类不能实例化对象。除非派生类实现了所有的纯虚函数。

8、多态

  • 相同对象收到不同信息或者不同对象收到相同信息采用不同的行为。c++支持两种多态性,编译型多态和运行时多态。
  • 编译型多态通过重载函数实现,运行时多态通过虚函数实现。
  • 静态多态(重载和模板)是在编译的时候,就确定调用函数的类型。动态多态(覆盖,虚函数)在运行的时候,才会决定调用哪个函数。运行基类指针指向派生类对象,并调用派生类的函数。

9、c实现c++的继承

#include <iostream>
using namespace std;
//struct默认public
//class默认private
struct A{
    virtual void fun(){
         cout << "A function" << endl;
    }
    int a;
};
struct B : A{
    virtual void fun(){
        cout << "B function" << endl;
    }
    int b;
};
//函数指针
typedef  void (*FUN)();
struct _A{
    FUN _fun;
    int _a;
};
//B类中包含A类对象。
struct _B{
    _A _a;
    int _b;
};
void _fA(){
    printf("_A:_fun\n");
}
void _fB(){
    printf("_B:_fun\n");
}
int main(){
    A a;
    B b;
    A* p1 = &a;
    p1->fun();//A function
    p1 = &b;
    p1->fun();//B function
    _A _a;
    _B _b;
    _a._fun = _fA;
    _b._a._fun = _fB;
    _A* p2 = &_a;
    p2->_fun();//_A:function
    p2 = (_A*)&_b;
    p2->_fun();//_B:function

    return 0;
}

10、c语言编译过程:预处理-->编译-->优化-->汇编-->链接-->可执行文件

猜你喜欢

转载自www.cnblogs.com/tingweichen/p/10786892.html