原创 線程同步

多進程或多線程訪問臨界資源時,必須進行同步控制。多進程或多線程的執行並不完全是絕對的並行運行,有可能主線程需要等待函數線程的某些條件發生。 多線程之間有幾個特殊的臨界資源:全局變量、堆區數據、文件描述符。 線程間同步控制方式: 1、信號量

原创 C和C++區別(一)

1、帶有默認值的函數: int sun(int a,int b = 20) { return a+b; } int mian() { int a=10; int b=20; sum(a,b);

原创 程序運行

程序運行: 1、創建虛擬地址空間到物理內存的映射(創建內核地址映射結構體),創建頁目錄和頁表 2、加載代碼段和數據段。 3、把可執行文件的入口地址寫到CPU的pc寄存器裏面。 首先來看一下,可執行文件的結構: 可執行文件和*.o文件

原创 C語言中強類型&弱類型

強類型:以初始化的全局數據; 弱類型:未初始化的全局數據; main.c #include<stdio.h> short x = 10; short y = 10; void func(); int main() {

原创 Guava源碼閱讀——Strings類

在之前使用jdk判空的時候會像下面這樣判斷: if(input==null || input.equals("")){ System.out.println("空字符串"); } Guava的Strings類提供了判空函數,需要的

原创 MySQL數據庫

一、SQL語句 SQL語句主要可以劃分爲3個類別: 1、DDL(Data Definition Languages)語句:數據定義語言。 這些語句定義了不同的數據段、數據庫、表、列、索引等數據庫對象的定義。常用的關鍵字主要包括:cre

原创 工廠模式

在程序設計時可以用基類指針指向其派生類對象,達到多態的目的。這裏很容易出現一個問題:n多個子類繼承一個抽象基類,不得不在每次用到子類的地方就寫new xxx的代碼。這裏帶來的兩個問題:1、必須知道實際子類的名字;2、程序的擴展性和維護性變

原创 枚舉

枚舉的定義:關鍵字enum + 枚舉類型名 + 枚舉成員列表 enum open_modes{input, output, append}; 默認第一個枚舉成員賦值爲0,後面的每個枚舉成員賦的值比前面的大1. 枚舉成員是常量。可以爲一個

原创 C++ STL

STL(Standard Template Liblrary),標準模板庫。 一、順序容器 vector 內存分配由allocator完成。 int main() { vector<int> vec1; if(

原创 智能指針

智能指針是行爲類似於指針的類對象,利用對象的析構函數,在對象過期時讓其析構函數刪除指向的堆內存。 智能指針主要有兩類: - 不帶引用計數的智能指針 C++庫的auto_ptr Boost庫的scrope_ptr - 帶

原创 繼承與多態

一、繼承是爲了實現代碼複用。有三種繼承方式:公有繼承(public)、保護繼承(protected)、私有繼承(private)。 class Base { public: int ma; protected: int m

原创 可變參數列表

在計算一系列值的平均數時,如果存於數組中很容易求得,但如果不存於數組直接傳參計算,那麼參數是3個還是5個還是更多呢?這就涉及到可變參數列表。 可變參數列表是通過宏來實現的,這些宏定義在頭文件stdarg.h中。 #include<std

原创 運算符重載

同時定義前綴式操作符和後綴式操作符存在一個問題:它們的形參數目和類型相同,普通重載不能區別所定義的是前綴式操作還是後綴式操作。通常後綴式操作符重載函數接受一個額外的int型形參,編譯器提供0作爲這個形參的實參。 前綴式操作返回改變後的值

原创 觀察者模式

說到觀察者模式,先來看一下MVC模式,如圖所示。 也就是M是觀察者,V是執行者。觀察者接收到請求(例如:註冊,登錄等)後,調用相應的視圖來處理。 #include<vector> #include<string> #include<

原创 string類的寫時拷貝

如圖所示,str1和str2指向的內存中內容是一樣的,如果系統淺拷貝的話,一個釋放後,另一個釋放時找不到要是放的內存;如果自己實現深拷貝,會出現內存浪費。所以實現string類的寫時拷貝。 引用計數放在什麼地方合適呢? 1、放在類