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