C/C 八股文(二)
時間:2021-09-26 13:28:05
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]C八股文(一)說一下static關鍵字的作用參考回答:1全局靜態(tài)變量在全局變量前加上關鍵字static,全局變量就定義成一個全局靜態(tài)變量。靜態(tài)存儲區(qū),在整個程序運行期間一直存在。初始化:未經(jīng)初始化的全局靜態(tài)變量會被自動初始化為0(自動對象的值是任意的,除非他被顯式初始化);作用域...
C 八股文(一)
說一下static關鍵字的作用
參考回答:1 全局靜態(tài)變量
在全局變量前加上關鍵字 static,全局變量就定義成一個全局靜態(tài)變量。靜態(tài)存儲區(qū),在整個程序運行期間一直存在。初始化:未經(jīng)初始化的全局靜態(tài)變量會被自動初始化為 0(自動對象的值是任意的,除非他被顯式初始化);作用域:全局靜態(tài)變量在聲明他的文件之外是不可見的,準確地說是從定義之處開始,到文件結尾。2 局部靜態(tài)變量
在局部變量之前加上關鍵字 static,局部變量就成為一個局部靜態(tài)變量。內存中的位置:靜態(tài)存儲區(qū)初始化:未經(jīng)初始化的全局靜態(tài)變量會被自動初始化為 0(自動對象的值是任意的,除非他被顯式初始化);作用域:作用域仍為局部作用域,當定義它的函數(shù)或者語句塊結束的時候,作用域結束。但是當局部靜態(tài)變量離開作用域后,并沒有銷毀,而是仍然駐留在內存當中,只不過我們不能再對它進行訪問,直到該函數(shù)再次被調用,并且值不變;3 靜態(tài)函數(shù)
在函數(shù)返回類型前加 static,函數(shù)就定義為靜態(tài)函數(shù)。函數(shù)的定義和聲明在默認情況下都是 extern 的,但靜態(tài)函數(shù)只是在聲明他的文件當中可見,不能被其他文件所用。函數(shù)的實現(xiàn)使用 static 修飾,那么這個函數(shù)只可在本 cpp 內使用,不會同其他 cpp 中的同名函數(shù)引起沖突;warning:不要再頭文件中聲明 static 的全局函數(shù),不要在 cpp 內聲明非static 的全局函數(shù),如果你要在多個 cpp 中復用該函數(shù),就把它的聲明提到頭文件里去,否則 cpp 內部聲明需加上 static 修飾;4 類的靜態(tài)成員
在類中,靜態(tài)成員可以實現(xiàn)多個對象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態(tài)成員是類的所有對象中共享的成員,而不是某個對象的成員。對多個對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象共用5 類的靜態(tài)函數(shù)
靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,它們都不是對象成員。因此,對靜態(tài)成員的引用不需要用對象名。在靜態(tài)成員函數(shù)的實現(xiàn)中不能直接引用類中說明的非靜態(tài)成員,可以引用類中說明的靜態(tài)成員(這點非常重要)。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時,可通過對象來引用。從中可看出,調用靜態(tài)成員函數(shù)使用如下格式:<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>)
;說一下C 和C的區(qū)別
參考回答:設計思想上:
C 是面向對象的語言,而C是面向過程的結構化編程語言語法上:
- C 具有封裝、繼承和多態(tài)三種特性
- C 相比 C,增加多許多類型安全的功能,比如強制類型轉換、
- C 支持范式編程,比如模板類、函數(shù)模板等
說一說c 中四種cast轉換
參考回答: C 中四種類型轉換是:static_cast
, dynamic_cast
,const_cast
, reinterpret_cast
1、const_cast
用于將 const 變量轉為非 const2、static_cast
用于各種隱式轉換,比如非 const 轉 const,void* 轉指針等, static_cast能用于多態(tài)向上轉化,如果向下轉能成功但是不安全,結果未知;3、dynamic_cast
用于動態(tài)類型轉換。只能用于含有虛函數(shù)的類,用于類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,如果是非法的對于指針返回NULL,對于引用拋異常。要深入了解內部轉換的原理。- 向上轉換:指的是子類向基類的轉換
- 向下轉換:指的是基類向子類的轉換
4、reinterpret_cast
幾乎什么都可以轉,比如將int轉指針,可能會出問題,盡量少用;5、為什么不使用 C 的強制轉換?
C 的強制轉換表面上看起來功能強大什么都能轉,但是轉化不夠明確,不能進行錯誤檢查,容易出錯。請說一下C/C 中指針和引用的區(qū)別?
參考回答- 指針有自己的一塊空間,而引用只是一個別名;
- 使用 sizeof 看一個指針的大小是4,而引用則是被引用對象的大??;
- 指針可以被初始化為 NULL,而引用必須被初始化且必須是一個已有對象 的引用;
- 作為參數(shù)傳遞時,指針需要被解引用才可以對對象進行操作,而直接對引 用的修改都會改變引用所指向的對象;
- 可以有 const 指針,但是沒有 const 引用;
- 指針在使用中可以指向其它對象,但是引用只能是一個對象的引用,不能 被改變;
- 指針可以有多級指針(**p),而引用止于一級;
- 指針和引用使用 運算符的意義不一樣;
- 如果返回動態(tài)內存分配的對象或者內存,必須使用指針,引用可能引起內存泄露。
給定三角形ABC和一點P(x,y,z),判斷點P是否在ABC內,給出思路并手寫代碼
參考回答:根據(jù)面積法,如果 P 在三角形 ABC 內,那么三角形 ABP 的面積 三角形 BCP 的面積 三角形 ACP 的面積應該等于三角形 ABC 的面積。算法如下:#include?
#include?
using?namespace?std;
#define?ABS_FLOAT_0?0.0001
struct?point_float
{
float?x;
float?y;
};
/**
*?@brief?計算三角形面積
*/
float?GetTriangleSquar(const?point_float?pt0,?const?point_float?pt1,?const?point_float?pt2)
{
????point_float?AB,???BC;
????AB.x?=?pt1.x?-?pt0.x;
????AB.y?=?pt1.y?-?pt0.y;
????BC.x?=?pt2.x?-?pt1.x;
????BC.y?=?pt2.y?-?pt1.y;
????return?fabs((AB.x?*?BC.y?-?AB.y?*?BC.x))?/?2.0f;
}
/**
*?@brief?判斷給定一點是否在三角形內或邊上
*/
bool?IsInTriangle(const?point_float?A,?const?point_float?B,?const?point_float?C,?const?point_float?D)
{
????float?SABC,?SADB,?SBDC,?SADC;
????SABC?=?GetTriangleSquar(A,?B,?C);
????SADB?=?GetTriangleSquar(A,?D,?B);
????SBDC?=?GetTriangleSquar(B,?D,?C);
????SADC?=?GetTriangleSquar(A,?D,?C);
????float?SumSuqar?=?SADB? ?SBDC? ?SADC;
????if?((-ABS_FLOAT_0?(SABC?-?SumSuqar))?