當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > C語(yǔ)言與CPP編程
[導(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)為非 const

2、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)換
它通過(guò)判斷在執(zhí)行到該語(yǔ)句的時(shí)候變量的運(yùn)行時(shí)類(lèi)型和要轉(zhuǎn)換的類(lèi)型是否相同來(lái)判斷是否能夠進(jìn)行向下轉(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ū)別?

參考回答

  1. 指針有自己的一塊空間,而引用只是一個(gè)別名;
  2. 使用 sizeof 看一個(gè)指針的大小是4,而引用則是被引用對(duì)象的大小;
  3. 指針可以被初始化為 NULL,而引用必須被初始化且必須是一個(gè)已有對(duì)象 的引用;
  4. 作為參數(shù)傳遞時(shí),指針需要被解引用才可以對(duì)對(duì)象進(jìn)行操作,而直接對(duì)引 用的修改都會(huì)改變引用所指向的對(duì)象;
  5. 可以有 const 指針,但是沒(méi)有 const 引用;
  6. 指針在使用中可以指向其它對(duì)象,但是引用只能是一個(gè)對(duì)象的引用,不能 被改變;
  7. 指針可以有多級(jí)指針(**p),而引用止于一級(jí);
  8. 指針和引用使用 運(yùn)算符的意義不一樣;
  9. 如果返回動(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?
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉