Time of Update: 2017-02-27
指標支援隱式轉換(implicit conversion), 在動態綁定中,衍生類別指標可以轉換為基類指標.但是模板的執行個體化(instantiations)之間, 是單獨存在的,衍生類別的執行個體化的模板(SmartPtr<Derived>), 不能轉換為基類執行個體化的模板(SmartPtr<Base>);需要明確的編寫, 因為衍生類別也可以繼續做為基類, 產生衍生類別, 所以無法直接寫出建構函式.使用成員函數模板(member function template)
Time of Update: 2017-02-27
char佔用一個位元組, 但不滿足4的倍數時, 會進行資料對齊, 使用4的倍數的位元組(byte).GCC:GCC中, 無論是虛函數還是虛繼承, 都需要將指標儲存在虛函數表(virtual function table), 佔用4個位元組.繼承會繼承基類的資料, 和虛函數表, 即繼承基類的空間.代碼:/* * test.cpp * * Created on: 2014.04.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.
Time of Update: 2017-02-27
本文分為兩方面一.Native C++調用Native C++ DLL 並測試回合時間二. 完全由C# 實現運算代碼 並測試回合時間詳細過程:一:至於如何擷取EfficiencyNativeCPPDLL.dll 和 EfficiencyNativeCPPDLL.lib 以及產生項目EfficiencyNativeCPPDLL本文講述在VS2010中本地C++調用C++類庫以進行效率測試1. 常見Win32控制台應用程式 ConsoleCPPInvokeDLL2.選擇下一步點擊完成就可以了3
Time of Update: 2017-02-27
有些函數, 所有參數都需要使用類型轉換, 比如乘法, 寫一個有理數類Rational, 需要執行乘法操作:函數滿足: Rational = Rational*double; Rational = double*Rational; 則需要使用非成員函數(non-member);成員函數的發起者必須是類, 因為可能出現double類型在前的情況, 則無法執行乘法, 所以應使用非成員函數;執行時: 即Rational = Rational*Rational(double); Rational =
Time of Update: 2017-02-27
RTTI, RunTime Type Information, 運行時類型資訊, 是多態的主要組成部分,通過運行時(runtime)確定使用的類型, 執行不同的函數,複用(reuse)介面.dynamic_cast<>可以 使基類指標轉換為衍生類別的指標, 通過判斷指標的類型, 可以決定使用的函數.typeid(), 可以判斷類型資訊, 判斷指標指向位置, 在多態中, 可以判斷基類還是衍生類別.代碼:/* * test.cpp * * Created on: 2014.04.
Time of Update: 2017-02-27
vector<>類型的數組, 計算均值和方差的最簡方法.代碼:double sum = std::accumulate(std::begin(resultSet), std::end(resultSet), 0.0); double mean = sum / resultSet.size(); //均值 double accum = 0.0; std::for_each (std::begin(resultSet), std::end(resultSet), [&
Time of Update: 2017-02-27
庫函數優先順序隊列(priority_queue)的實現方式是堆(heap), 預設是輸出最大值.輸出最小值, 需要指定參數, priority_queue<int, vector<int>, greater<int> >代碼:/* * main.cpp * * Created on: 2014.7.20 *更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/ *
Time of Update: 2017-02-27
C++複製容器(container)元素, 可以使用標準庫(STL)的copy()和copy_n()函數.函數樣式: OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)代碼:/* * main.cpp * * Created on: 2014年6月17日 * Author: Spike */ #include <iostream>
Time of Update: 2017-02-27
類包含4個函數, 啟動程式, 遍曆所有進程, 關閉程式, 遍曆進程依賴的動態連結程式庫.樣本: Image.exe是預先產生的可執行程式(exe), 啟動程式, 間隔5秒, 關閉程式.使用方法參加測試程式.代碼:/* * process.h * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #ifndef TRAVERSEPROCESSMODEL_H #define
Time of Update: 2017-02-27
遍曆程式使用的動態連結程式庫(dll), 首先需要遍曆所有進程, 匹配進程名稱與進程ID, 然後根據進程名稱, 輸出所有使用的庫(dll).樣本中Image.exe是預先啟動的程式. 程式碼封裝含遍曆進程的代碼, 和輸出動態連結程式庫(dll)的代碼.代碼:/* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #
Time of Update: 2017-02-27
多重繼承, 如果基類(base class)的成員函數名稱相同,重載(overload)函數調用, 會忽略public和private, 選取最佳的匹配函數,匹配度相同, 則會造成歧義, 產出錯誤:request for member 'xxx' is ambiguous, (GCC)如需使用, 可以添加具體的網域作業符, 指定類("class::method()").代碼如下:/* * test.cpp * * Created on: 2014.04.14 *
Time of Update: 2017-02-27
複合方式(composition)和 private繼承, 都能表示, 根據某個類實現出新的類的形式, 即通過使用protected成員, 和重寫virtual函數.優先選擇複合方式. 原因:1. 複合方式, 可以實現重寫virtual函數, 然後阻止衍生類別重新定義virtual函數;2. 可以使Widget的編譯依存度降至最低, 即只包含類的聲明式(複合), 而避免包含基類的標頭檔(繼承);例外: private繼承, 可以使EBO(空白基類最佳化), 在某些空白基類的情況下很重要,
Time of Update: 2017-02-27
EBO, empty base optimization, 即空白基類最佳化, 可以使衍生類別節省空間的;但是如果使用複合(composition)的方式, 因為定義了新對象, 所以編譯器會進行填充(padding), 填充進一個int, 4位的空間;代碼:/************************************************* File: test.cpp Copyright: C.L.Wang Author: C.L.Wang Date: 2014-04-11
Time of Update: 2017-02-27
阻止衍生類別重新定義虛函數, 在java和C#中可以很簡單的實現(finale&sealed),但在C++中則需要使用public繼承+複合(composition)的方法;注意: 使用私人繼承(private), 無法實現此要求.如:/************************************************* File: test.cpp Copyright: C.L.Wang Author: C.L.Wang Date: 2014-04-11
Time of Update: 2017-02-27
繼承介面和實現, 主要包含三種方式:1. 只繼承介面, 純虛函數;2. 繼承介面和實現, 允許覆寫(override), 虛函數;3. 繼承介面和實現, 不允許覆寫(override), 非虛函數;1. 純虛函數:只繼承介面, 但是衍生類別必須實現其介面;純虛函數也可以包含實現, 但是只能在指明類(即, class::)的時候使用2. 虛函數:繼承介面和實現, 衍生類別可以覆寫(override), 也可以使用預設版本, 即基函數(base)版本;純虛函數約束程式更多, 虛函數更靈活;3.
Time of Update: 2017-02-27
C++使用C語言的time庫, 即可統計程式的已耗用時間;標頭檔#include <ctime>代碼:#include<iostream> #include<ctime> void do_something() { for(int i=0;i<100000;i++) for(int j=0;j<10000;j++) ; } int main(int arg,char ** argv) {
Time of Update: 2017-02-27
寫入程式, 需要在檔案夾中寫入資料, 如果檔案夾不存在, 則無法寫入, 在程式入口需要判斷;由於屬於系統層, Windows的兩種解決方案.參考: http://stackoverflow.com/questions/8233842/how-to-check-if-directory-exist-using-c-and-winapi1. GetFileAttributesA()函數DWORD d = GetFileAttributesA(const char* filename);
Time of Update: 2017-02-27
在多重繼承(multiple inheritance)中, 可能出現多個基類繼承自同一個基類, 即"菱形繼承", 會導致最頂層的基類, 被複製多次;可以採用虛繼承(virtual inheritance)的方式, 使衍生類別(derived class)只保留最頂層基類的一個副本.virtual, 即需要vptr(virtual table pointer), 即虛表指標, 額外佔用4個位元組;代碼如下:/* * test.cpp * * Created on: 20
Time of Update: 2017-02-27
類(class)和物件導向:顯示介面(explicit interface): 即在原始碼中可見, 可以在標頭檔內看到類的所有介面;運行期多態(runtime polymorphism):成員函數是virtual, 傳入類的引用或指標時, 在運行時, 會自動匹配介面, 可能是基類的介面, 也可能是衍生類別的;模板(templates)和泛型程式設計(generic programming):隱式介面(implicit interface):typename T, 在函數中, 所必須支援一組操作,
Time of Update: 2017-02-27
類成員的預設初始化順序是按照聲明順序進行, 如果使用初始化列表初始化成員變數, 則必須按照成員變數的聲明順序進行;否則, 在變數之間交替賦值時, 會產生, 未初始化的變數去賦值其他變數;同時GCC, 也會發出警告, 如: 'class::m_xxx' will be initialized after [-Wreorder]代碼:/* * BInsertSort.cpp * * Created on: 2014年4月15日 * Author: Spike */ #