C++面试题目总结(持续更新......)

Q1:C++的三大特性?

封装、继承和多态       注:如果问四大特性,加“抽象”即可。

详见:https://blog.csdn.net/weixin_37753215/article/details/81222620

Q2:什么是浅拷贝,什么是深拷贝?

浅拷贝是系统默认提供的拷贝构造,它一般是简单的值拷贝,如果类中存在指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。这时就需要深拷贝来解决该问题。

深拷贝需要重新申请一个堆区空间。当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间,深拷贝

       浅拷贝中两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针

Q3:什么是重载,继承,重写,多态?

重载:函数或者方法有相同的名称,但是参数列表不相同(顺序、个数、类型等不同)的情形。 一个接口,多种实现

继承:如果两个类存在继承关系,则子类会自动继承父类的方法和变量,在子类中可以调用父类的方法和变量。 代码重用

重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。  外壳不变,核心重写

多态:对象在调用同名函数时发生了不同的行为或者结果。父类的引用或者指针指向子类对象

隐藏:是指派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。

重载和重写的区别:

(1)范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。

(2)参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。

(3)virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。

隐藏和重写,重载的区别:

(1)与重载范围不同:隐藏函数和被隐藏函数在不同类中。

(2)参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。

Q4:写一个排序算法(冒泡排序)?

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
using namespace std;
//从头向尾遍历
//相邻两数进行比较
//将最大数(相对)沉入尾部(相对)
void BubbleSort1(int *arr, int sz){
    int i = 0;
    int j = 0;
    assert(arr);
    for (i = 0; i<sz - 1; i++){
        for (j = 0; j<sz - i - 1; j++){
            if (arr[j]>arr[j + 1]){
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}
//从尾向头遍历
//相邻两数进行比较
//将最小数(相对)冒泡到头部(相对)
void BubbleSort2(int *arr, int sz){
    int i = 0;
    int j = 0;
    assert(arr);
    for (i = 0; i<sz - 1; i++){
        for (j = sz; j>i; j--){
            if (arr[j]>arr[j - 1]){
                int tmp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = tmp;
            }
        }
    }
}
//测试函数
//为了方便起见,将参数设定为一个函数指针
void TestBubbleSort(void(*BubbleSort)(int *arr, int sz))        //BubbleSort可改为BubbleSort2
{
    int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    BubbleSort(arr, sz);                                         //BubbleSort可改为BubbleSort2
    for (i = 0; i<sz; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}
int main(){
    TestBubbleSort(BubbleSort1);
    TestBubbleSort(BubbleSort2);
    system("pause");
    return 0;
}

Q5:C++中分为几个存储区?

数据区(data)--->静态数据  常量
代码区(code)
栈区(stack)
堆区(heap)

Q6:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章