c++(七)
- 內聯函數
- 內聯函數的特點
- 為什么要有內聯函數
- 內聯函數是如何工作的呢
- 類型轉換
- 異常處理
- 智能指針
- 單例模式
- 懶漢模式
- 餓漢模式
- VS中數據庫的相關配置
內聯函數
修飾類的成員函數,關鍵字:inline
inline 返回值類型 函數名(參數列表)
{
;
}
內聯函數的特點
<1>代碼量少 3-5行
<2>頻繁調用
<3>邏輯簡單
為什么要有內聯函數
頻繁的調用一個函數時,就需要頻繁的出棧、入棧,此時內存的開銷就比較大
內聯函數是如何工作的呢
<1>普通函數:當函數調用發生時,編譯器通常會生成跳轉指令,將控制權轉移到函數代碼所在的地方,執行
完之后又跳轉到函數調用的位置
<2>內聯函數:直接把調用函數的語句用函數體來代替
注意:
<1>是不是內聯由編譯器決定
<2>內聯函數只是對編譯器的建議
類型轉換
異常處理
報錯(語法錯誤、邏輯錯誤);
c++引入了一種異常處理的機制:
先找到可能出現異常的代碼塊、拋出異常、捕獲異常
異常的處理機制:
exception:標準異常的基類
try
{
有可能出現異常的代碼塊;
throw(拋出異常);//基本數據類型、類類型
}
catch()//捕獲異常
{
}
#include <iostream>
using namespace std;
double div(double a, double b)
{if (0 == b){//throw -1;//throw "分母為0";//throw string("分母不能為0");throw exception("分母不能為0");}else{return a / b;}
}
int main()
{double a, b;cin >> a >> b;try{div(a, b);}catch (int e){cout << "異常是:" << e << endl;}catch (const char* e){cout << "異常是:" << e << endl;}catch (string e){cout << "異常是:" << e << endl;}catch (exception e){cout << "異常是:" << e.what() << endl;}return 0;
}
智能指針
解決什么問題:有時候在堆區申請的空間,自己忘記釋放了
類模板
<1>自動智能指針:auto_ptr
<2>共享智能指針:shared_ptr
同時多個智能指針操作同一塊的堆區空間,當所有的指針生命周期結束的時候,堆區的空間會自動釋放
<3>獨享智能指針:unique_ptr
同一時刻,智能有一個指針指向堆區的空間,當這個指針生命周期結束的時候,堆區的空間會自動釋放
<4>弱型智能指針:
弱型智能指針不能單獨使用,只能和共享智能指針配合使用,弱型智能指針生命周期結束的時候并不會影
響堆區空間的釋放,只有共享智能指針的生命周期結束的時候,堆區的空間才會被釋放
#include <iostream>
using namespace std;
class Demol
{
public:Demol(int* p = nullptr) :p(p){cout << "Demo(int *)" << endl;this->p = new int;*(this->p) = 88;}
~Demol()
{delete p;cout << "~Demol()" << endl;
}
private:int* p;
};
int main()
{//Demol d;//Demol* p = new Demol;Sshared_ptr<Demol> ptr(new Demol);return 0;
}
單例模式
一個類只能創建一個對象
需求:
<1>構造函數只能調用一次 //打開數據庫
<2>類內創建對象(靜態成員變量)
<3>要訪問這個對象(靜態成員函數)
類的設計
1、構造函數必須私有化
2、靜態的成員:保存唯一的對象
3、靜態的成員函數:獲取唯一的對象
懶漢模式
哪里需要,就在哪里創建
存在的問題:
在多線程中,多個線程都要獲取這個單例對象
解決:線程鎖
餓漢模式
不管是否使用,都準備好
存在的問題:
占用資源
建議:一般使用懶漢模式
VS中數據庫的相關配置
<1>將這3個文件放到工程路徑下
<2>右鍵項目,屬性