C++面试复习 笔记三

 8. 派生类的构造函数和析构函数

基类的构造函数和析构函数不能被派生类继承,会被自动调用

构造派生类时执行的顺序依次是:基类构造函数的参数化列表->基类构造函数的函数体->派生类构造函数参数化列表->派生类构造函数函数体

析构派生类时执行的顺序依次是:派生类的析构函数->派生类中对象的析构函数->基类的析构函数->基类中对象的析构函数

class D

{

public:

    D()

    {

        std::cout<<"构造函数D"<<std::endl;

    }

    ~D()

    {

        std::cout<<"析构函数D"<<std::endl;

    }

};

class A

{

private:

    D d;

public:

    A()

    {

        std::cout<<"构造函数A"<<std::endl;

    }

    ~A()

    {

        std::cout<<"析构函数A"<<std::endl;

    }

};





class B

{

public:

    B()

    {

        std::cout<<"构造函数B"<<std::endl;

    }

    ~B()

    {

        std::cout<<"析构函数B"<<std::endl;

    }

};



class C : public A

{

private:

    B b;

public:

    C():b()

    {

        std::cout<<"构造函数C"<<std::endl;

    }

    ~C()

    {

    std::cout<<"析构函数C"<<std::endl;

    }

};

9. 重载,覆盖和隐藏

重载

* 在同一个类中

* 函数名相同

* 参数不同,包括类型和个数

* 返回值也可不同

* virtual关键字可有可无

class E

{

public:

    virtual int fun();

    void fun(int a);

    void fun(int a, int b);

void fun(float a);  

};

覆盖

* 派生类中的成员函数覆盖基类中的同名函数

* 基类函数必须是虚函数

* 函数的参数类型和个数必须相同

* 函数名必须相同

class E

{

public:

    virtual int fun();

    virtual bool fun1(int a);

};



class F : public E

{

public:

    int fun();



};



class G : public F

{

public:

    bool fun1(int a);

};

隐藏

派生类中的同名函数屏蔽了基类中的函数,若基类函数为虚函数,派生类中同名函数参数和返回值都相同,则是覆盖,若有不同,则是隐藏 ,若基类函数不是虚函数,则派生类中的同名函数肯定会把基类中的同名函数隐藏掉

class E

{

public:

    virtual int fun();

    virtual bool fun1(int a);

    float fun2(bool b);

};



class F : public E

{

public:

    int fun(int a);

    float fun2(int b);



};



class G : public F

{

public:

    int fun1(bool b);

};

 10. 虚函数

* 动态联编的基础

* virtual 修饰的函数

* 对多态性的支持

* virtual修饰的函数被重写,该函数就具有多态性

* 多态其实就是父类指针指向具体的子类对象

* 本质是由虚函数表和虚函数指针来实现的


 

11. 结构体和共用体

* 结构体的大小是其最大成员字节数的整数倍

* 分配各成员字节数时,会根据相邻成员字节数响应填充部分空间

* 按成员的顺序分配内存

* 共用体的大小等于其最大成员所占的字节数

* 共用体每次只能存储一个成员的值

struct aa

{

    short a;//4

    int b;//4

    char c;//4

};



struct aa

{

    char c;//2

    short a;//2

    int b;//4

};
union AAA

{

    int a;

    double b;

    char c;

};



union AAA a;

a.a = 8;

a.b = 12.0;

printf("%d,%f, %d", a.a,a.b,sizeof(a));


 

12.0 内存管理

自动存储

栈存储,如函数的形参,函数内部声明的变量及结构体变量

静态存储

编译器预分配

extern声明的变量为全局变量,可定义性 声明extern int a = 10

引用性声明

动态存储

new/delete

猜你喜欢

转载自blog.csdn.net/tianzhiyi1989sq/article/details/90349171