总结一些C/C++的知识点
?
1 指針和引用的區(qū)別
2 靜態(tài)變量和普通變量的區(qū)別
4 阻塞和非阻塞
是把數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間緩沖區(qū)這段時(shí)間而言的。
⑴如果發(fā)送緩沖區(qū)剩余空間> 想要發(fā)送data字節(jié)數(shù)
阻塞非阻塞都會(huì)將數(shù)據(jù)拷貝到內(nèi)核,并且大小就是想要發(fā)送數(shù)據(jù)的大小;
⑵如果發(fā)送緩沖區(qū)剩余空間< 想要發(fā)送data字節(jié)數(shù)
①阻塞模式
會(huì)阻塞,等到內(nèi)核緩沖區(qū)有足夠的空閑空間,再繼續(xù)將數(shù)據(jù)拷貝到內(nèi)核,直到拷貝完,返回值就是發(fā)送數(shù)據(jù)的數(shù)據(jù)量;
②非阻塞模式
當(dāng)內(nèi)核緩沖區(qū)被填滿后立即返回,返回值是已經(jīng)拷貝到發(fā)送緩沖區(qū)的數(shù)據(jù)量。
5 static關(guān)鍵字的作用
⑴在面向過(guò)程的編程中
①隱藏。在變量或者函數(shù)前加上static,只是對(duì)本文件可見(jiàn),對(duì)其他文件不可見(jiàn)。
②只初始化一次,并且默認(rèn)初始化為0
③如果作為static局部變量在函數(shù)內(nèi)定義,它的生存期為整個(gè)源程序,但是其作用域是定義該變量的函數(shù),只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后,盡管該變量還繼續(xù)存在,但不能使用它。
⑵面向?qū)ο蟮木幊?/p>
①類的靜態(tài)成員函數(shù)是屬于整個(gè)類而非類的對(duì)象,所以它沒(méi)有this指針,僅能訪問(wèn)類的靜態(tài)數(shù)據(jù)和靜態(tài)成員函數(shù)。
②不能將靜態(tài)成員函數(shù)定義為虛函數(shù)。
③在類中定義static相當(dāng)于一個(gè)全局變量,但是一定在類外進(jìn)行初始化,
int son::num=222;
④在不聲明類對(duì)象就能使用類中的變量和函數(shù),只需要在前面加上作用域就可以;
6 const作用
①可以定義const常量,如const int Max = 100;
②便于進(jìn)行類型檢查,保護(hù)被修飾的東西,防止意外的修改,如
void f(const int i){...}編譯器就會(huì)知道i是一個(gè)常量,不允許修改
③const定義的常量在程序運(yùn)行過(guò)程中只有一份拷貝,
④修飾指針
const int *A; //const修飾指向的對(duì)象,A可變,A指向的對(duì)象不可變
int *const A; //const修飾指針A,A不可變,A指向的對(duì)象可變
const int *constA; //指針A和A指向的對(duì)象都不可變
⑤修飾引用
const double &A; //該引用所引用的對(duì)象不能被更新
⑥修飾函數(shù)的返回值
是返回值不可被改變,格式如下:constint Fun1();
⑦修飾類的成員變量
int Fun() const;這樣,函數(shù)Fun中不能修改類里面的數(shù)據(jù)。
⑧在另一連接文件中引用const常量
extern const inti; //正確的引用
extern const int j =10;//錯(cuò)誤,常量不可以被再次賦值
⑨提高了效率
編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒(méi)有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。
7 斐波那契數(shù)列求時(shí)間復(fù)雜度
例T(n) = 2T(n/2)+1,其時(shí)間復(fù)雜度是O(n);
公式:T(n) = aT(n/b)+f(n); a遞歸調(diào)用次數(shù)
b數(shù)據(jù)規(guī)模
f(n)單次過(guò)程的時(shí)間復(fù)雜度
比較 和f(n) ① > f(n) 時(shí)間復(fù)雜度是:O()
② < f(n) O()
8 break :跳出當(dāng)前循環(huán)或者switch語(yǔ)句
Continue:結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán)
9、斐波那契數(shù)列求第n項(xiàng)
注意只要用到后一項(xiàng)等于幾的情況都要考慮斐波那契數(shù)列。
①下一項(xiàng)等于前兩項(xiàng)的和
②下一項(xiàng)等于前(n-1)項(xiàng)的和
10、結(jié)構(gòu)與聯(lián)合有和區(qū)別?
11、main 函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?
答案:全局對(duì)象的構(gòu)造函數(shù)會(huì)在main 函數(shù)之前執(zhí)行。
12.分別寫出BOOL,int,float,指針類型的變量a 與“零”的比較語(yǔ)句。
BOOL : if ( !a ) or if(a) Int : if ( a == 0) float : const EXPRESSION EXP = 0.000001 if ( a < EXP && a >-EXP) pointer : if ( a != NULL) or if(a == NULL)13.const與 #define 的比較,const有什么優(yōu)點(diǎn)?
14.全局變量和局部變量有什么區(qū)別?是怎么實(shí)現(xiàn)的?操作系統(tǒng)和編譯器是怎么知道的?
①生命周期不同:
全局變量隨主程序創(chuàng)建而創(chuàng)建,隨主程序銷毀而銷毀;
局部變量在局部函數(shù)內(nèi)部,甚至局部循環(huán)體等內(nèi)部存在,退出就不存在;
②使用方式不同:
通過(guò)聲明后全局變量程序的各個(gè)部分都可以用到;
局部變量只能在局部使用;分配在棧區(qū)。
③操作系統(tǒng)和編譯器通過(guò)內(nèi)存分配的位置來(lái)知道的,全局變量分配在全局?jǐn)?shù)據(jù)段并且在程序開始運(yùn)行的時(shí)候被加載。局部變量則分配在堆棧里面。
15. 什么時(shí)候需要“引用”?
流操作符<<和>>、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用引用。
以上 2-8 參考:http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx
16. extern “C”
在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù),為什么要加extern “C”?
⑴extern是C/C++語(yǔ)言中表明函數(shù)和全局變量作用范圍的關(guān)鍵字,該關(guān)鍵字告訴編譯器, 其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。
⑵使用的時(shí)候,是在模塊的頭文件中,對(duì)本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲明。
例如,如果模塊B欲引用該模塊A中定義的全局變量和函數(shù)時(shí),需要在A的頭文件中把B想要引用的A的全局變量和函數(shù)前面加上extern,而B在使用的時(shí)候只需包含模塊A的頭文件即可。
⑶extern "C"用于C++要使用C的變量和函數(shù)的時(shí)候,是連接申明,被extern "C"修飾的變量和函數(shù)是按照C語(yǔ)言方式編譯和連接的。
C++支持函數(shù)重載,而過(guò)程式語(yǔ)言C則不支持。
例如,假設(shè)某個(gè)函數(shù)的原型為: voidfoo( int x, int y );
該函數(shù)被C編譯器編譯后在符號(hào)庫(kù)中的名字為_foo,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機(jī)制來(lái)實(shí)現(xiàn)函數(shù)重載的。
例如,在C++中,函數(shù)void foo( int x,int y )與void foo( int x,float y )編譯生成的符號(hào)是不相同的,后者為_foo_int_float。
實(shí)現(xiàn)C++與C及其它語(yǔ)言的混合編程。
明白了C++中extern"C"的設(shè)立動(dòng)機(jī),我們下面來(lái)具體分析extern "C"通常的使用技巧:
extern "C"的慣用法
(1)在C++中引用C語(yǔ)言中的函數(shù)和變量,在包含C語(yǔ)言頭文件(假設(shè)為cExample.h)時(shí),需進(jìn)行下列處理:
extern "C" { #i nclude"cExample.h" }而在C語(yǔ)言的頭文件中,對(duì)其外部函數(shù)只能指定為extern類型,C語(yǔ)言中不支持extern"C"聲明,在.c文件中包含了extern "C"時(shí)會(huì)出現(xiàn)編譯語(yǔ)法錯(cuò)誤。
C++引用C函數(shù)例子工程中包含的三個(gè)文件的源代碼如下:
/* c語(yǔ)言頭文件:cExample.h */ #ifndef C_EXAMPLE_H #define C_EXAMPLE_H extern int add(int x,int y); #endif /* c語(yǔ)言實(shí)現(xiàn)文件:cExample.c */ #i nclude"cExample.h" int add( int x, int y ) { return x + y; } // c++實(shí)現(xiàn)文件,調(diào)用add:cppFile.cpp extern "C" { #i nclude"cExample.h" } int main(int argc, char* argv[]) { add(2,3); return 0; }如果C++調(diào)用一個(gè)C語(yǔ)言編寫的.DLL時(shí),當(dāng)包括.DLL的頭文件或聲明接口函數(shù)時(shí),應(yīng)加extern"C" { }。
(2)在C中引用C++語(yǔ)言中的函數(shù)和變量時(shí),C++的頭文件需添加extern"C",但是在C語(yǔ)言中不能直接引用聲明了extern "C"的該頭文件,應(yīng)該僅將C文件中將C++中定義的extern "C"函數(shù)聲明為extern類型。
C引用C++函數(shù)例子工程中包含的三個(gè)文件的源代碼如下: //C++頭文件 cppExample.h #ifndef CPP_EXAMPLE_H #define CPP_EXAMPLE_H extern "C" int add( int x, int y ); #endif //C++實(shí)現(xiàn)文件 cppExample.cpp #i nclude"cppExample.h" int add( int x, int y ) { return x + y; } /* C實(shí)現(xiàn)文件 cFile.c /* 這樣會(huì)編譯出錯(cuò):#i nclude "cExample.h" */ extern int add( int x, int y ); int main( int argc, char* argv[] ) { add( 2, 3 ); return 0; }17 面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別?
面向?qū)ο蟮娜齻€(gè)特點(diǎn)是封裝,繼承和多態(tài)。
①封裝性上
面向?qū)ο蟮姆庋b:將一系列的數(shù)據(jù)和方法封裝在類中;
面向過(guò)程的封裝:數(shù)據(jù)用struct封裝,方法不封裝,方法和數(shù)據(jù)是分離的。
②代碼復(fù)用上
面向?qū)ο?#xff1a;利用繼承的方式服用;
面向過(guò)程:只能以普通的函數(shù)復(fù)用。
18 map,set的底層實(shí)現(xiàn)?
Map和set都是STL中的關(guān)聯(lián)容器,內(nèi)部采用的就是一種非常高效的平衡檢索二叉樹:紅黑樹來(lái)實(shí)現(xiàn)的;
Map內(nèi)部自建一顆紅黑樹,這棵樹具有對(duì)數(shù)據(jù)自動(dòng)排序的功能,所以map內(nèi)部所有的數(shù)據(jù)都是有序的;一個(gè)map是一鍵值對(duì)序列,
紅黑樹是結(jié)合了鏈表添加刪除方便;和數(shù)組查找效率高的優(yōu)點(diǎn),所以map應(yīng)用起來(lái)方便高效。
19 map,set的區(qū)別?
vector封裝數(shù)組,list封裝了鏈表,map和set封裝了二叉樹等
①M(fèi)ap和set都是屬于STL中的關(guān)聯(lián)容器,
MAP的節(jié)點(diǎn)是一對(duì)數(shù)據(jù).;使用關(guān)鍵值Key來(lái)唯一標(biāo)識(shí)每一個(gè)成員 map可以重復(fù);
SET的節(jié)點(diǎn)是一個(gè)數(shù)據(jù),set是一個(gè)集合 。
只不過(guò),map的形式 map<type1, type2> mymap;
set的形式 set<type> myset;
②map是映射集合中的元素不能重復(fù),set可以進(jìn)行集合的各種操作(交并補(bǔ)等),當(dāng)然set一般是用平衡樹或哈西表實(shí)現(xiàn)的。
List特點(diǎn):元素有放入順序,元素可重復(fù)
Map特點(diǎn):元素按鍵值對(duì)存儲(chǔ),無(wú)放入順序
Set特點(diǎn):元素?zé)o放入順序,元素不可重復(fù)(注意:元素雖然無(wú)放入順序,但是元素在 set中的位置是有該元素的HashCode決定的,其位置其實(shí)是固定的)
如果大家對(duì)C/C++感興趣的話,可以加一下我們的學(xué)習(xí)交流Q群:637 ?935 ?295,免費(fèi)領(lǐng)取一套學(xué)習(xí)資料和視頻課程喲~
總結(jié)
以上是生活随笔為你收集整理的总结一些C/C++的知识点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一键导出Origin图片MATLAB代码
- 下一篇: [C++学习笔记]C++常见问题大全(一