1、對於一個頻繁使用的短小函數,在c語言中應用什么實現,在c++中應用什么實現
答:c:宏定義;c++:inline內聯函數
2、全局變量和局部變量的區別?
答:
1、生命周期不同:
全局變量:隨主程序創建而創建,隨主程序結束而銷毀。
局部變量:函數或者{}括號內部,退出或執行完就銷毀
2、作用域不同:
全局變量:源文件內所有函數都可以使用
局部變量:函數內部或者{}括號內部有效,只能局部使用
3、內存分配不同:
全局變量:全局數據段並且在程序運行的時候加載
局部變量:分配在堆棧里
3、在申請內存找不大足夠大的內存塊,malloc和new將返回NULL指針,內存申請失敗,怎么處理內存耗盡?
答:直接return
4、如何判斷一個操作系統是16位還是32位系統
答:
1、使用變量指針*p,sizeof(p) == 2 為16位,==4 為32位
2、unsigned int a = ~0; if( a > 65536 ) 為32位,否則 16位
5、為什么數組名做參數會改變數組內容?
答:數組名就是數組的首地址
6、析構函數和虛函數的用法和作用?
答:
析構函數:是c++特殊的類成員函數,沒返回值、沒參數、不能調用。在類對象執行完畢,作用是銷毀並釋放內存。
虛函數:是c++多態的一種表現,使用虛函數可以動態綁定,當然也會以系統開銷為代價的
7、引用和指針有什么區別?
答:
引用:必須初始化;初始化后不能改變;不存在指向空值
指針:不必初始化;指針可以改變所指對象;指針可以指向空值
8、虛函數只能借助引用或者指針來達到多態的效果。
9、在c++中能否有虛構造函數?
答:不能,只能有虛析構函數。
10、重載、重寫、重定義的區別?
答:
重載:類對象的同名不同參函數
重寫:子類繼承父類的函數
重定義:子類繼承父類的虛函數
11、i++和++i的效率比較
答:
-》內建數據類型的情況,效率一樣
-》自定義數據類型的情況,++i效率高
12、理解內聯函數和宏的區別
答:
-》內聯函數在編譯時展開,宏在預編譯時展開
-》在編譯的時候,內聯函數可以直接嵌套到目標代碼中,宏只是一個簡單的文本替換
-》內聯函數可以完成類型檢測、語句檢查等功能,宏不具有這樣的功能
13、引用和指針易錯點:
-》int &c:引用類型的變量必須初始化。
-》int &d = 2,&d = c:引用類型只能初始化的時候賦值
-》int *p; *p = 5:*p是野指針,直接賦值很危險
14、類的靜態成員和靜態函數:
-》靜態成員 不能在內部初始化,只能在類定義外面初始化
-》靜態函數,在類外使用,因它不含this指針,所以不能調用類內的非靜態成員
15、explicit構造函數:作用是防止隱式轉換
16、賦值構造函數與復制構造函數的區別
賦值構造函數:引用指針對象
格式: A& operator = (const A& other)
clas A;
A a;
A b;
b = a;// 賦值調用
復制構造函數:復制指針對象;以參數傳進來的對象初始化產生一個對象
格式:A(const A& other):m_i(other.m_i)
A a;
A b = a;//復制構造函數調用
17、臨時對象在什么情況下產山(會影響程序的執行效率)
-》參數按值傳遞
void fun1( Test test);
-》返回值按值傳遞
void fun1( ){
Test t(2);
teturn t;
}
解決辦法:改成對象引用傳入
void fun1( Test &test);
18、內存申請,使用之前檢查
-》函數參數:
assert( p != NULL);
-》malloc或者new
if( p != NULL )
釋放了內存卻繼續使用它。
有三種情況:
(1)程序中的對象調用關系過於復雜,實在難以搞清楚某個對象究竟是否已經釋放了內存,此時應該重新設計數據結構,從根本上解決對象管理的混亂局面。
(2)函數的return語句寫錯了,注意不要返回指向“棧內存”的“指針”或者“引用”,因為該內存在函數體結束時被自動銷毀。
(3)使用free或delete釋放了內存后,沒有將指針設置為null。導致產生“野指針”。
【規則1】用malloc或new申請內存之后,應該立即檢查指針值是否為null。防止使用指針值為null的內存。
【規則2】不要忘記為數組和動態內存賦初值。防止將未被初始化的內存作為右值使用。
【規則3】避免數組或指針的下標越界,特別要當心發生“多1”或者“少1”操作。
【規則4】動態內存的申請與釋放必須配對,防止內存泄漏。
【規則5】用free或delete釋放了內存之后,立即將指針設置為null,防止產生“野指針”。