班裡一同學總結的,呵呵。雖然還是不夠全面,但是還是可以用來對付一些筆試面試的。
一.基本資料類型(WINDOWS32位機下)
Char 1個位元組
Short 2
Int 4
Long 4
Float 4
Double 8
Long double 10
指針: 32位機. 4個位元組.
浮點數雙精度的比較;
Float f;
判斷F是否為0
If( f>=-0.00001&&f<=0.00001){ =0} else {!=0};
------------------------------------------------------------------------------
-----------------------------------
二.修飾保留字.
Const:
Const char*p//p 指向的内容不能被修改
Char const *p; // p指針不能修改
Const type fun(); // 傳回值類型為一個const type類型,不能修改
Fun( const char *p); fun( const A &a) //保護指針,引用傳遞的值不被修改.
類成員函數:中 fun() const; //表明FUN不能修改成員變量,不調用非const 成員函數.
Volatile:
修飾變量時,確定變修改後儲存在記憶體中,每次取數從記憶體中取.
Static:
靜态變量: 儲存于資料段中., 隻初始化一次.
全局變量(外部變量)的說明之前再冠以static 就構成了靜态的全局變量。全局變量本身就
是靜态存儲方式, 靜态全局變量當然也是靜态存儲方式。 這兩者在存儲方式上并無不同
。這兩者的差別雖在于非靜态全局變量的作用域是整個源程式, 當一個源程式由多個源文
件組成時,非靜态的全局變量在各個源檔案中都是有效的。 而靜态全局變量則限制了其作
用域, 即隻在定義該
變量的源檔案内有效, 在同一源程式的其它源檔案中不能使用它。由于靜态全局變量的作
用域局限于一個源檔案内,隻能為該源檔案内的函數公用, 是以可以避免在其它源檔案中
引起錯誤。
從以上分析可以看出, 把局部變量改變為靜态變量後是改變了它的存儲方式即改變了
它的生存期。把全局變量改變為靜态變量後是改變了它的作用域, 限制了它的使用範圍。
static函數與普通函數作用域不同,僅在本檔案。隻在目前源檔案中使用的函數應該
說明為内部函數(static),内部函數應該在目前源檔案中說明和定義。對于可在目前源文
件以外使用的函數,應該在一個頭檔案中說明,要使用這些函數的源檔案要包含這個頭文
件。
static全局變量與普通的全局變量有什麼差別:static全局變量隻初使化一次,防止在其
他檔案單元中被引用;作用域限于本檔案!
static局部變量和普通局部變量有什麼差別:static局部變量隻被初始化一次,下一
次調用函數時依據上一次結果值進行改變;
如: fun()
{
Static int m=0;
M++;
Cout<<m<<endl;
}
調用:
Fun();
Fun();
輸出: 1
2
static函數與普通函數有什麼差別:static函數在記憶體中隻有一份,普通函數在每個
被調用中維持一份拷貝。作用域限于本檔案
------------------------------------------------------------------------------
---------------------------------------
三.記憶體使用:
程式的局部變量存在于(堆棧)中,全局變量存在于(靜态區 即資料段)中,動态申請數
據存在于( 堆)中。
配置設定方式有三種,請記住:
-1- 靜态存儲區,是在程式編譯時就已經配置設定好的,在整個運作期間都存在,如全局
變量、常量,靜态變量.
-2- 棧上配置設定,函數内的局部變量就是從這配置設定的,但配置設定的記憶體容易有限。
-3- 堆上配置設定,也稱動态配置設定,如我們用new,malloc配置設定記憶體,用delete,free來釋放的
記憶體。
--------動态申請記憶體:---------------
Malloc/free 與 new/delete 的差別;
前者: 是C的庫函數. 在C++中建立對像時,不會調用構造函數,FREE時也不會調用析構函數
.
後者: 是C++中運算符, 建立析構對象都會調用構造函數,與析構函數.
注意:
Free(p)或delete p後, P成為野指針, 并非為空, (P所指位址不變,隻是所指記憶體已
釋放)
兩次釋放P會出錯.
最好,釋放後加個P=NULL. 空指針多次釋放不會出錯.
------------------------------------------------------------------------------
---------------------------------------
四.運算符:
++,--操作:
A++ : A加一後, 表達式傳回A加一前的附本,(非左值)
++A: A加一後,表達式傳回加一後的A.(左值)
位運算.
使用異或交換資料: 交換A與B的值
A^=B; 即: A=A^B;
B^=A; B=B^A;
A^=B; A=A^B;
------------------------------------------------------------------------------
---------------------------------------
五.語句:
For(A;B;C) C語句是在每次循環後才執行.
如: y=10;
for( i=0;i<10;y=++i)
{
Cout<<y<<endl;// 第一次輸出是10.
}
循環語句設計:
盡量小循環放外面,大循環放裡面.-----原因減少循環之間的切換.
------------------------------------------------------------------------------
---------------------------------------
六.函數設計:
參數傳遞選擇--------
作為輸入參數的,應該用CONST作保護 如:strcpy(char*str1,const char*str2)
要修改函數外面的變量時可用 :
1, 指針傳遞: 即把變量位址傳入函數; 如: FUN( int**m);
調用時: int m=0;
FUN(&m);
2. 引用傳遞: FUN(int &m),調用時:int m=0; fun(m);
3. 如果隻要修改一個外面的變量,也可以用傳回值解決,但是多個的話就要
用上面兩種方法中的一種.
内部變量:
Static 變量;(注意);
FUN()
{
Static int m=0;
……..
}
其中M 隻初始化一次. 每次調用FUN()後,都會在前一次調用的基礎上進行修改M 值
函數指針:
如: void (*pFun)(int); 則pFun 為一個函數指,函數參數必須為一個INT參數.
調用:
pFun=FUN;
pFun(b); 或 (*pFun)(b); //一定要加個括号;
(主要用于回調函數設計)
另一種定義:
Typedef void (*pFun)(int a);
則pFun成為一個函數參數為一個INT的函數指針類型.
定義: pFun p=FUN;
函數傳回:
不要傳回棧記憶體指針;
如: char* fun()
{
Char a[]=”kdkdk”;///棧中的一塊記憶體
Return a;///傳回棧中記憶體位址。
}
(面向對象的函數設在後面);
------------------------------------------------------------------------------
----------------------------------------
七.指針與數組;
指針++,--;
Int *p;
如果p++後,則P的值應該是增加4
指針的累加與它自己的類型有關.
Char str[]=”akakak”;
Strlen(str) 是求串的長度, 是以一定要小心那個’\0’結束符;
Strcpy(str1,str2);, ///一定要小心’\0’
------------------------------------------------------------------------------
----------------------------------------
面向對象:
一. 類
預設四個函數: 無參數構造函數, 拷貝構造函數(淺拷貝), 指派函數(淺), 析構函數.
重寫指派函數時,注意要避免自指派.(參考高品質C++,string類的編寫)
--------------------------------------------------------------------------
函數重載: 同一區域内,函數名相同,參數清單不同.(略)---實作編譯時多态
函數覆寫: 在子類與父類之間. 由虛函數産生.--------------運作時多态
Class A
{
Virtual void fun(){}
};
Class B: public A
{
Void fun(){}
}
則子類中的fun()覆寫了父類中的fun();
函數隐藏: 在子類與父類之間, 不是虛函數,但是函數名相同,參數清單不一定相同.
子類函數會隐藏父類的同名函數.
Class A
{
Void Fun 1();
Void Fun2();
}
Class b : pubic A
{
Void Fun1();
Void Fun2(int);
}
則fun1,fun2都隐藏了父類的同名函數.
基類指針與子類指針的使用:
假設A為父類,B為子類;
定義: B b;
A*pA=&b;/// pA隻能調用A類中的函數,和B中繼承了A中的虛函數.
/// 但是不能調用,A中被覆寫的函數與B類中的其它函數.
B*pB=&b; pB隻能調用B類中的所有可通路函數,和A中繼承下來的所有
/// 公有函數. 但是不能調用A中被B隐藏或覆寫的函數.
--------------------------------------------------------
帶virtual 的析構函數:
Class A
{
Virtual ~A(){ cout<<”in A”<<endl; }
}
Class B: public A
{
Virtual ~B(){ cout<<”in B”<<endl;}
}
定義:
A*Pa=new B;
Delete pa;
輸出:in A
In B
但是如果,A中的析構函數沒有virtual, 則結果隻是:in A
原因: 不明!
類中回調函數設計:
使用友元函數,或 static 函數。
原因:兩者不存在this指針。
如果要修改對象成員,則可以把對象指針或引用傳入函數。
如: static void fun(A*Pa),,,or static void fun(A&a);
面向對象函數設計:
Void fun(A a) -----------------//出現臨時對象
{
-----------其它代碼;
A aa;
Return (aa);--------------//出現臨時對象;
}
優化後:
Void fun(A&a)
{
---------其它代碼
RETURN (A());
}
類大小計算:
空類,大小不為0;
static成員變量,當sizeof()求類對象大小時,static變量不會計入其中。
其它參考sizeof()專題
解決頭檔案重複包含:
1.#pragma once.
2. ifndef/define/endif
------------------------------------------------------------------------------
----------------------------------------
二.運算符重載。
指派: A& operator=(A&other) //傳回引用。
{
避免自指派;
---------其它代碼---------
Return *this;
}
前++:A& operator++()///自加後傳回本身。傳回值為引用。
{
This->value+=1;
Return *this;
}
後++:A operator++(int)/int 用于區另前加加,還是後加加。//值傳回
{
A temp(*this); /自加後,傳回一個自加前的附本。
*this->value+=1;
Return temp;
}
非類成員函數++,定義(友元)
A& operator++(A&a)//前加加
A operator++(A&a,int)//後加加。
函數實作同上。
(其中減減的與++類似)
多繼承有待補充;?/???????
模闆
------------------------------------------------------------------------------
----------------------------------------
資料結構與算法
(最好這裡能做到于老師的标準:看到題目就能寫出算法)
---------------------------------------------------------------------
連結清單操作:(不帶頭結點,書上的都是帶頭結點的)
主要是不帶頭結點的操作,記住可能要修改頭指針,是以注意函數參數與傳回值設計。(
細心);(華為面試)
靜态連結清單
棧隊列的使用:
二叉樹周遊,圖周遊,非遞歸實作。(華為,三G門戶面試);
串操作:
KMP算法(模式比對) (深信服筆試);
二叉樹:
三種周遊—遞歸與非遞歸。(華為面試);
計算葉子數,計算結點數。(華為筆試,迅雷筆試);
哈夫曼樹--------(不知什麼公司的面試題了);
圖:
十字連結清單結構
兩種周遊---深度(非遞歸與遞歸),廣度-----隊列。
查找:
二分查找-----遞歸與非遞歸。(普信筆試)
二叉排序樹
紅黑樹(了解,深信服面試)set ,map内部使用。
B-,B+樹,了解。
鍵樹-----用二叉對表示,鍵的比對。
哈希表------哈希函數編寫,解決沖突的方法4個(深信服面試);
内部排序:
插入排序
快排
堆排序,堆操作。
歸并排序------------各種形式的歸并(QQ筆試);
基數排序。
(記住各種排序的複雜度,最好會自己計算.)
其它算法:
Strcpy, strcmp, strcat, memcpy, string類的編寫。
最大公約數,最小公倍數,素數,PI計算。
連結清單環判斷,連結清單交點判斷。找連結清單中間結點,連結清單反序。(華為面試)
八皇後------深信服筆試,(一個朋友的QQ面試)
STL:
Vertor List set map, 使用與内部實作。
------------------------------------------------------------------------------
----------------------------------------
--------------------系統程式設計(windows or unix)------------------------------
(可以在windows 與UNIX中選擇一個,如果兩個都行就更好)
多程序
多線程
程序/線程間同步與通信.-------這個也很重要.
CriticalSection, mutex, event, semaphore.差別與使用
Unix下不懂.
網絡程式設計-------select()與setsockopt(),多點傳播,廣播.問得最多.
最好能寫出所有常的SOCKET函數,和基本流程.
TCP/IP協定, TCP, IP ,UDP 頭的組成.各個控制位的作用.
位址分類,子網,子網路遮罩,多點傳播位址,廣播位址,網絡号,主機号.
MFC下的 SendMessage()與PostMessage()差別.
-----------------------------------------------------------------
資料庫:
多個關系表設計,
基本SQL語句的編寫,嵌套查詢,多表查詢
作業系統:
P---V操作。生産者與消費者。用代碼實作。(華為面試);
(A一天生産3個餅,B一天生産4個餅,C一天吃10個,現有100個餅,用PV操作
程式設計,問多少天可以吃完)
------------------------項目----------------------------
如果你沒有項目,那你就把自己的課程設計也搬出來,不要怕别人笑你.千萬不要說大話,什
麼東西我很牛B,面試官幾句話可以試出你來.自己有料的地方一定要突出給他看.
項目分析:
系統功能-》整體架構-》自己負責的子產品-》遇到的困難-》有待改進的地方-》存在的瓶頸
,與解決方案。
(個人認為按上面的順序分析項目,面試前一定要先自己對自己介紹下項目)
------------------------------面試細節-----------------------------------
1---面試進門後,一定要向面試官問好,等面試官示意坐下時才坐下. 面試完後, 要道謝,
如果對方和你握手,一定要站起來
握手要有力,表達自己的誠意.(可以說:希望我有機會為公司效力…等等之類的話);
2---當問及工資問題時,(書面形式寫期望工資) 一定要說按公司薪水制度.
原因: 剛從學校出對公司沒有貢獻,工資應該和貢獻成正比,按公司的薪水制度比較合
理.
3-----描術自己的強項??弱點???職業目标??,性格??自我介紹??為什麼要選擇做這個職位
/公司?? 用英語描術學校,家鄉(華為面試)
(最好中英文都會表達,一定要作好這些準備)
4---你有什麼問題要問嗎????不要關涉工資和教育訓練.,要表明自己加入公司的決心.
(中大一學生的回答:是否進入公司就可以接手項目,個人覺得不錯)
6---越簡單的題目越是考你的細心.是以要注意細節,小心再小心.
7---說話要表現自我,千萬不能說自己
什麼很了不起….絕不可說大話,錯了就是錯了,要承認.
不會的,也要直接說不會(也可請教),會的就直接說出來.,不要吞吞吐吐,不要不懂裝懂
.
如果面試官說自己錯了,但自己發現不了,可以請教下面試官(能不能指點下我哪裡錯了
,我真看不出來),慮心學習,并改正.即使BS了,也要抵住壓力,不要就起身走人,要請教面試
官,錯在哪,應該怎麼做.??要順着面試官的意思,不要與其争執.一定要抗壓力,抵住.
8—成績問題:
主要是針對和我一樣成績很差的同學。當面試官問到怎麼你的成績那麼差。你一定
要想到好的解圍方法。他不是看不起你而是給你施加壓力,看你在壓力面前怎麼樣解決問
題,能不能抵住壓力。
9---自信,一定要自信,但不是自認清高。
當問到你是哪個學校的,“汕頭大學”這四個字要說響亮點。
不要怕周圍的人是什麼大的,而我們是汕大的,再不說扇死你。
--
有一個目标,我要在畢業後兩年内完成
無論結果怎麼樣,我都會一直堅持下去