C++基礎
1、static作用
C:在函數體中,static局部變量在被調用過程中維持值不變
在模塊內,static變量可被模塊內所用函數訪問,但模塊外函數不能使用,是一個本地的全局變量
在模塊內,一個static函數只能被這一模塊內的其他函數調用
C++:
在類中,static數據成員可實現多個對象之間的數據共享,是類的所有對象的共享成員,在內存中只佔一份空間,如果改變其 值,則所有對象的這個數據成員的值都會改變。靜態數據成員在程序開始運行時被分配空間,到程序結束之後釋放,只要類中指定了靜態數據成員,即使不定義對象,也會爲靜態數據成員分配空間。
static成員函數,也是類的靜態成員,非靜態成員函數有this指針,而靜態成員函數沒有this指針,靜態成員函數主要用來訪問靜態數據成員而不能訪問非靜態成員。
2、volatile關鍵字修飾舉例
中斷服務程序中修改的供其他程序檢測的變量
多任務環境下各個任務間共享的變量
存儲器映射的硬件寄存器,因爲每次對它的讀寫都可能有不同意義
3、const和#define
Const常量是編譯運行階段使用,而define宏是預處理階段展開
const常量有具體的類型,編譯時會執行類型檢查
const常量是在靜態存儲區中分配空間,在程序運行過程中內存中僅有一個拷貝,而define僅僅是展開,給出的是立即數,不分配內存
4、重載和覆蓋
重載(overload)
函數或者方法有相同的名稱,但參數列表不同(類型或順序或數目)
重寫(override)
重寫存在於類中,子類重寫從基類繼承過來的函數,但函數名、返回值和參數列表都必須與基類相同
5、float類型變量判斷是否爲0
if(a >= -0.00001 && a <= 0.00001)
6、幾種排序算法
A、冒泡排序
一次比較兩個元素,如果滿足排序條件則交換它們的位置,如此重複直到沒有需要再交換的元素
for(i = 0;i < len-1;i++)
{
for(j = 0; j < len-1-i;j++)
{
if(arr[j] > arr[j+1])
{
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
B、選擇排序
在位排序的序列中找到最小(大)元素,存放到排序的起始位置,再從剩餘未排序中繼續尋找最小(大)元素放到已排序元素的末尾
for(int i = 0; i < len-1; i++)
{
minIndex = i;
for(int j = i+1; j < len; j++)
{
if(arr[j] < arr[minIndex])
minIndex = j;
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tem;
}
C、插入排序
通過構建有序序列,對於未排序序列數據,在已排序列中從後向前掃描,找到相應位置插入
for(int i = 1; i < len; i++)
{
preIndex = i-1;
current = arr[i];
while(preIndex >= 0 && arr[preIndex] > current)
{
arr[preIndex + 1] = arr[preIndex];
preIndex--;
}
arr[preIndex + 1] = current;
}
D、希爾排序
先將整個待排序的序列分割成若干個序列(選擇一個增量),再分別進行插入排序
for(int gap = len/2;gap > 0;gap = gap/2)
{
for(int i = gap; i<len;i++)
{
int j = i;
int current = arr[i];
while(j - gap >= 0 && current < arr[j-gap])
{
arr[j] = arr[j-gap];
j = j - gap;
}
arr[j] = current;
}
E、二分查找
int left = 0;
int right = length - 1;
while(left <= right)
{
int mid = (right + left) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
left = mid +1;
else
right = mid -1;
}