Time of Update: 2018-12-04
extern "C" 解析時常在cpp的代碼之中看到這樣的代碼: #ifdef __cplusplusextern "C" { #endif //一段代碼 #ifdef __cplusplus } #endif 這樣的代碼到底是什麼意思呢?首先,__cplusplus是cpp中的自訂宏,那麼定義了這個宏的話表示這是一段cpp的代碼,也就是說,上面的代碼的含義是:如果這是一段cpp的代碼,那麼加入extern "C"{和}處理其中的代碼。 要明白為何使用extern
Time of Update: 2018-12-04
分析C語言中的進階聲明時,記住三點:1、用於聲明變數的運算式和普通的運算式在求值時所使用的規則相同2、下標運算子[ ] 和( )的優先順序大於*3、從裡往外分解,可以使用替代符號協助分解例子:1、 int (*f) []; int *f[];前者是指標,指向數組,數組的元素是int後者是數組,數組的元素是int *指標2、int f()[]; int f[]();前者,f()是函數,傳回值是int[],聲明非法,因為函數傳回值只能是標量值,不能是數組後者,f[]
Time of Update: 2018-12-04
最近公司的一個項目要在windows下實現MD5的函數功能,所以查閱了一些資料,現在我將完整實現發布,希望對有需要的人有協助實現就是這樣子,大家如有需要直接用就可以,沒怎麼有必要去研究那幾個Windows API,具體就不再細說了,有問題歡迎提問。#include "windows.h"#include <tchar.h> #include <stdio.h>/*調用Windows API 獲得 MD5 碼 */void GetMd5(LPCWSTR
Time of Update: 2018-12-04
C#檔案拖放操作(DragDrop File)轉自:http://www.csframework.com/archive/1/arc-1-20110817-1799.htm首先將表單的 AllowDrop=True;C# Code://拖檔案到表單上觸發DragEnter事件private void Form1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e){ if
Time of Update: 2018-12-04
在學習中,總是想要些成就感的。當你沒有做過一些事情的時候,總是不能知道所學知識究竟能幹些什麼。一些人可以淡定地按老師的指點,紮實地學習基本知識,有些人則不能。無論如何,如果在課堂學習過程中,就可以完成一個象樣的項目,那是一件很酷的事情,對能淡定地學下來的同學,也將更有激情。 基於這種想法,老賀想“閉門造車”,和大家隨著C++程式設計課程的進展,也做個“項目”出來。這純屬課外安排,願者自來。中間可能會有些困難,依靠我們集體的力量還是可以完成的。記住,將最新進展寫到你的部落格中,一則留個記錄,二則
Time of Update: 2018-12-04
================================================條款35:確定你的public inheritance模塑出“is-a”的關係1、public inheritance描述的是“is-a(是一種)”的關係(牢記這一條)。2、每一個型別為Derived的對象同時也是一個型別為base的對象,反之不成立。意思是Base比Derived表現出更一般化的概念,而比Derived比Base表現出更特殊化的概念。 class Person {...};
Time of Update: 2018-12-04
最近我的同事和一些網友都說C/C++中“空語句”(就是單獨一個分號的語句)具有延時的作用,可以用來寫延時代碼。其實這是一種錯誤的理解。 首先,有人認為空白語句經編譯後,產生彙編代碼是“NOP”指令,NOP指令是空操作指令,執行一個指令周期時間,所以認為C/C++中的“空語句”還有延時的功能,其實這是錯誤的,“空語句”是不會產生任何有效指令代碼的,是不具有延時做用的。 有人說如下代碼是具有延時做用,實際上下邊的延時功能主要是加法運算和條件判斷運算指令起到了延時的作用。 for(int i; i &
Time of Update: 2018-12-04
一直記得C語言中,結構體是不可以直接賦值的。我問了三個同學,都說在C++中可以,在C語言中不可以,需要逐一成員賦值或者用memcpy函數。我測試了一下如下的程式:#include <stdio.h>#include <stdlib.h>struct test{ int a; int b; char ss[10];};int main(){ struct test t1 = {1, 2, "hello"};
Time of Update: 2018-12-04
在新浪微博的筆試上遇到這類題目當時的做法是直接malloc(m*n*k),回來後發現不對。現列出詳細代碼,引以為戒: int main(){ int i, j, k;//5 6 7三維矩陣 //malloc char ***p=(char ***)malloc(5*sizeof(char **)); for(i=0;i<5;i++) { p[i]=(char **)malloc(6*sizeof(char *)); for(j=
Time of Update: 2018-12-04
條款32 禁止複製存取修飾詞(public、protected、private)可用於表達和執行進階約束技術。常見的一種約束技術就是限制對象的複製行為。做法是,將複製建構函式、複製賦值操作符聲明為private,同時不提供定義。class NoCopy{private: NoCopy(const NoCopy&);//禁止copy constructor NoCopy &operator=(const NoCopy&);//禁止複製賦值操作符}; 條款33
Time of Update: 2018-12-04
條款25 實參相依的尋找當尋找該調用何種函數時,編譯器會到實參所在的命名空間中尋找函數,使之成為候選調用函數之一 條款26 操作符函數尋找直接叫用作業符時,遵循普通的函數尋找規則;使用中綴文法叫用作業符時,編譯器也會考慮實參所在那個的命名空間 兩個候選------實參所在的命名空間 | ---------調用函數所在的命名空間例子:class X{public: X operator %(const X &)const;//設為函數2
Time of Update: 2018-12-04
C/C++語言實現動態數組C數組的小問題 這裡說的動態數組是可以根據需要動態增長佔用記憶體的數組,比如程式初始分配了100個元素,可是運行了一段時間後區區100個空間不能滿足了,現在需要400個,怎麼辦呢;那肯定需要再額外分配300個。 C語言有realloc()函數來解決空間擴充的問題,但是不要忘了realloc可能會遷移記憶體,很多時候數組中的元素會被其它函數/模組引用,如果地址發生了變化,結果將是災難性的。 那麼STL的vector呢?它也有相同的問題。
Time of Update: 2018-12-04
問題:建構函式可以拋出異常嗎?解構函式可以嗎?從文法上來說,建構函式和解構函式都可以拋出異常。但從邏輯上和風險控制上,建構函式可以,解構函式不推薦拋出異常。(參見effective c++ 條款08
Time of Update: 2018-12-04
詳細可參考 《effective c++》第三版 條款49:瞭解new_handler的行為相關連結:http://blogold.chinaunix.net/u/3374/showart_1849816.html 當operator new申請一個記憶體失敗的時候,它會進行如下的處理步驟: 1、如果存在客戶指定的處理函數,則調用處理函數(new_handler),如果不存在則拋出一個異常。 2、繼續申請記憶體配置請求。
Time of Update: 2018-12-04
有關const成員、static成員、const static成員的初始化: 1、const成員:只能在建構函式後的初始化列表中初始化2、static成員:初始化在類外,且不加static修飾3、const static成員:類只有唯一一份拷貝,且數值不能改變。因此,可以在類中聲明處初始化,也可以像static在類外初始化 樣本:#include <iostream>using std::cout;using std::endl;class base{public: base(
Time of Update: 2018-12-04
Singleton模式是常用的設計模式之一,但是要實現一個真正實用的設計模式卻也不是件容易的事情。1. 標準的實現class Singleton{public: static Singleton * Instance() { if( 0== _instance) { _instance = new Singleton; }
Time of Update: 2018-12-04
深度剖析C和C++的複雜類型聲明曾經碰到過讓你迷惑不解、類似於int * (* (*fp1) (int) ) [10];這樣的變數聲明嗎?本文將由易到難,一步一步教會你如何理解這種複雜的C/C++聲明。 我們將從每天都能碰到的較簡單的聲明入手,然後逐步加入const修飾符和typedef,還有函數指標,最後介紹一個能夠讓你準確地理解任何C/C++聲明的“右左法則”。
Time of Update: 2018-12-04
1:java中沒有虛函數的概念,但是有抽象函數的概念,用abstract關鍵字表示,java中抽象函數必須在抽象類別中,而且抽象 函數不能有函數體,抽象類別不能被執行個體化,只能由其子類實現抽象函數,如果某個抽象類別的子類仍是抽象類別,那麼該子類不需要實現其父類的抽象函數。2:C++中有虛函數的概念,用virtual 關鍵字來表示,每個類都會有一個虛函數表,該虛函數表首先會從父類中繼承得到父類的虛函數表,
Time of Update: 2018-12-04
對關注效能的程式開發人員而言,一個好的計時組件既是益友,也是良師。計時器既可以作為程式組件協助程式員精確的控製程序進程,又是一件有力的調試武器,在有經驗的程式員手裡可以儘快的確定程式的效能瓶頸,或者對不同的演算法作出令人信服的效能比較。 在Windows平台下,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應用場合而言還是太粗糙了。另一種是QueryPerformanceCount計數器,隨系統的不同可以提供微秒級的計數。對於即時圖形處理
Time of Update: 2018-12-04
一個32位的運行在保護模式下應用程式,無論是Linux 還是Windows 都給它分配一個4GB的平坦的記憶體空間一個運行著的c程式所佔用的記憶體空間分為:代碼區 初始化資料區 未初始化資料區 堆區 和 棧區 在地址上從高位到地位為(高位)棧區堆區未初始化資料區(即BBS)資料區代碼區(低位)棧區存放函數的參數值、局部變數的值 ,由編譯器自動分配釋放比如實現函數的遞迴調用堆區用於動態分配記憶體,一般由程式員來分配釋放下面用一斷代碼來展示c程式記憶體配置//main.cint a = 0;