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: