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:

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