BAT面試 基礎篇(一)

● 說一下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++中static關鍵字的作用

參考回答:

對于函數(shù)定義和代碼塊之外的變量聲明酬姆,static修改標識符的鏈接屬性,由默認的external變?yōu)閕nternal奥溺,作用域和存儲類型不改變辞色,這些符號只能在聲明它們的源文件中訪問。

對于代碼塊內部的變量聲明浮定,static修改標識符的存儲類型相满,由自動變量改為靜態(tài)變量,作用域和鏈接屬性不變桦卒。這種變量在程序執(zhí)行之前就創(chuàng)建立美,在程序執(zhí)行的整個周期都存在。

對于被static修飾的普通函數(shù)方灾,其只能在定義它的源文件中使用建蹄,不能在其他源文件中被引用

對于被static修飾的類成員變量和成員函數(shù),它們是屬于類的裕偿,而不是某個對象洞慎,所有對象共享一個靜態(tài)成員。靜態(tài)成員通過<類名>::<靜態(tài)成員>來使用嘿棘。

● 請說一下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ù)表>);


image.png

為大家準備了很多面試資料和學習入門+進階+深入的資料碰凶,關注公zhon號,名企內推軍鹿驼,回復 資料 二字可獲取

● 說一說c++中四種cast轉換

參考回答:

C++中四種類型轉換是:static_cast, dynamic_cast, const_cast, reinterpret_cast

1欲低、const_cast

用于將const變量轉為非const

2、static_cast

用于各種隱式轉換畜晰,比如非const轉const伸头,void*轉指針等, static_cast能用于多態(tài)向上轉化,如果向下轉能成功但是不安全舷蟀,結果未知;

3面哼、dynamic_cast

用于動態(tài)類型轉換野宜。只能用于含有虛函數(shù)的類,用于類層次間的向上和向下轉化魔策。只能轉指針或引用匈子。向下轉化時,如果是非法的對于指針返回NULL闯袒,對于引用拋異常虎敦。要深入了解內部轉換的原理。

向上轉換:指的是子類向基類的轉換

向下轉換:指的是基類向子類的轉換

它通過判斷在執(zhí)行到該語句的時候變量的運行時類型和要轉換的類型是否相同來判斷是否能夠進行向下轉換政敢。

4其徙、reinterpret_cast

幾乎什么都可以轉,比如將int轉指針喷户,可能會出問題唾那,盡量少用;

5褪尝、為什么不使用C的強制轉換闹获?

C的強制轉換表面上看起來功能強大什么都能轉,但是轉化不夠明確河哑,不能進行錯誤檢查避诽,容易出錯。

● 請說一下C/C++ 中指針和引用的區(qū)別璃谨?

參考回答:

1.指針有自己的一塊空間沙庐,而引用只是一個別名鲤妥;

2.使用sizeof看一個指針的大小是4,而引用則是被引用對象的大泄旃Α旭斥;

3.指針可以被初始化為NULL,而引用必須被初始化且必須是一個已有對象 的引用古涧;

4.作為參數(shù)傳遞時垂券,指針需要被解引用才可以對對象進行操作,而直接對引 用的修改都會改變引用所指向的對象羡滑;

5.可以有const指針菇爪,但是沒有const引用;

6.指針在使用中可以指向其它對象柒昏,但是引用只能是一個對象的引用凳宙,不能 被改變;

7.指針可以有多級指針(**p)职祷,而引用至于一級氏涩;

8.指針和引用使用++運算符的意義不一樣;

9.如果返回動態(tài)內存分配的對象或者內存有梆,必須使用指針是尖,引用可能引起內存泄露。

● 給定三角形ABC和一點P(x,y,z)泥耀,判斷點P是否在ABC內饺汹,給出思路并手寫代碼

參考回答:

根據(jù)面積法,如果P在三角形ABC內痰催,那么三角形ABP的面積+三角形BCP的面積+三角形ACP的面積應該等于三角形ABC的面積兜辞。算法如下:

<pre style="margin: 12px 0px; padding: 0.25em 1em; font-weight: 400; font-size: 14px; position: relative; border-left: 2px solid rgb(26, 188, 156); background: rgb(246, 248, 250); word-break: break-word; font-family: Courier, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: normal; overflow: auto; line-height: 1.45; border-radius: 0px 3px 3px 0px; border-top: none; border-right: none; border-bottom: none; border-image: initial; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">#include <iostream>

include <math.h>

using namespace std;

define ABS_FLOAT_0 0.0001

struct point_float
{
float x;
float y;
};</pre>

/**

  • @brief 計算三角形面積

*/

<pre style="margin: 12px 0px; padding: 0.25em 1em; font-weight: 400; font-size: 14px; position: relative; border-left: 2px solid rgb(26, 188, 156); background: rgb(246, 248, 250); word-break: break-word; font-family: Courier, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: normal; overflow: auto; line-height: 1.45; border-radius: 0px 3px 3px 0px; border-top: none; border-right: none; border-bottom: none; border-image: initial; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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;
}</pre>

/**

  • @brief 判斷給定一點是否在三角形內或邊上

*/

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

|

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)) && ((SABC - SumSuqar) < ABS_FLOAT_0))

{

return true``;

}

else

{

return false``;

}

}

|

● 請你說一下你理解的c++中的smart pointer四個智能指針: shared_ptr,unique_ptr,weak_ptr,auto_ptr

參考回答:

C++里面的四個智能指針: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三個是c++11支持,并且第一個已經(jīng)被11棄用夸溶。

為什么要使用智能指針:

智能指針的作用是管理一個指針逸吵,因為存在以下這種情況:申請的空間在函數(shù)結束時忘記釋放,造成內存泄漏缝裁。使用智能指針可以很大程度上的避免這個問題胁塞,因為智能指針就是一個類,當超出了類的作用域是压语,類會自動調用析構函數(shù)啸罢,析構函數(shù)會自動釋放資源。所以智能指針的作用原理就是在函數(shù)結束時自動釋放內存空間胎食,不需要手動釋放內存空間扰才。

1. auto_ptr(c++98的方案,cpp11已經(jīng)拋棄)

采用所有權模式厕怜。

<pre style="margin: 12px 0px; padding: 0.25em 1em; font-weight: 400; font-size: 14px; position: relative; border-left: 2px solid rgb(26, 188, 156); background: rgb(246, 248, 250); word-break: break-word; font-family: Courier, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: normal; overflow: auto; line-height: 1.45; border-radius: 0px 3px 3px 0px; border-top: none; border-right: none; border-bottom: none; border-image: initial; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”));
auto_ptr<string> p2;
p2 = p1; //auto_ptr不會報錯.</pre>

此時不會報錯衩匣,p2剝奪了p1的所有權蕾总,但是當程序運行時訪問p1將會報錯。所以auto_ptr的缺點是:存在潛在的內存崩潰問題琅捏!

2. unique_ptr(替換auto_ptr)

unique_ptr實現(xiàn)獨占式擁有或嚴格擁有概念生百,保證同一時間內只有一個智能指針可以指向該對象柄延。它對于避免資源泄露(例如“以new創(chuàng)建對象后因為發(fā)生異常而忘記調用delete”)特別有用蚀浆。

采用所有權模式,還是上面那個例子

|

1

2

3

|

unique_ptr<string> p3 (``new string (``"auto"``)); ``//#4

unique_ptr<string> p4搜吧; ``//#5

p4 = p3;``//此時會報錯J锌 !

|

編譯器認為p4=p3非法滤奈,避免了p3不再指向有效數(shù)據(jù)的問題摆昧。因此,unique_ptr比auto_ptr更安全蜒程。

另外unique_ptr還有更聰明的地方:當程序試圖將一個 unique_ptr 賦值給另一個時绅你,如果源 unique_ptr 是個臨時右值,編譯器允許這么做昭躺;如果源 unique_ptr 將存在一段時間勇吊,編譯器將禁止這么做,比如:

<pre style="margin: 12px 0px; padding: 0.25em 1em; font-weight: 400; font-size: 14px; position: relative; border-left: 2px solid rgb(26, 188, 156); background: rgb(246, 248, 250); word-break: break-word; font-family: Courier, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: normal; overflow: auto; line-height: 1.45; border-radius: 0px 3px 3px 0px; border-top: none; border-right: none; border-bottom: none; border-image: initial; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">unique_ptr<string> pu1(new string ("hello world"));
unique_ptr<string> pu2;
pu2 = pu1; // #1 not allowed
unique_ptr<string> pu3;
pu3 = unique_ptr<string>(new string ("You")); // #2 allowed</pre>

其中#1留下懸掛的unique_ptr(pu1)窍仰,這可能導致危害。而#2不會留下懸掛的unique_ptr礼殊,因為它調用 unique_ptr 的構造函數(shù)驹吮,該構造函數(shù)創(chuàng)建的臨時對象在其所有權讓給 pu3 后就會被銷毀。這種隨情況而已的行為表明晶伦,unique_ptr 優(yōu)于允許兩種賦值的auto_ptr 碟狞。

注:如果確實想執(zhí)行類似與#1的操作,要安全的重用這種指針婚陪,可給它賦新值族沃。C++有一個標準庫函數(shù)std::move(),讓你能夠將一個unique_ptr賦給另一個泌参。例如:

<pre style="margin: 12px 0px; padding: 0.25em 1em; font-weight: 400; font-size: 14px; position: relative; border-left: 2px solid rgb(26, 188, 156); background: rgb(246, 248, 250); word-break: break-word; font-family: Courier, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: normal; overflow: auto; line-height: 1.45; border-radius: 0px 3px 3px 0px; border-top: none; border-right: none; border-bottom: none; border-image: initial; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">unique_ptr<string> ps1, ps2;
ps1 = demo("hello");
ps2 = move(ps1);
ps1 = demo("alexia");
cout << *ps2 << *ps1 << endl;</pre>

3. shared_ptr

shared_ptr實現(xiàn)共享式擁有概念脆淹。多個智能指針可以指向相同對象,該對象和其相關資源會在“最后一個引用被銷毀”時候釋放沽一。從名字share就可以看出了資源可以被多個指針共享盖溺,它使用計數(shù)機制來表明資源被幾個指針共享∠巢可以通過成員函數(shù)use_count()來查看資源的所有者個數(shù)烘嘱。除了可以通過new來構造昆禽,還可以通過傳入auto_ptr, unique_ptr,weak_ptr來構造。當我們調用release()時蝇庭,當前指針會釋放資源所有權醉鳖,計數(shù)減一。當計數(shù)等于0時哮内,資源會被釋放盗棵。

shared_ptr 是為了解決 auto_ptr 在對象所有權上的局限性(auto_ptr 是獨占的), 在使用引用計數(shù)的機制上提供了可以共享所有權的智能指針。

成員函數(shù):

use_count 返回引用計數(shù)的個數(shù)

unique 返回是否是獨占所有權( use_count 為 1)

swap 交換兩個 shared_ptr 對象(即交換所擁有的對象)

reset 放棄內部對象的所有權或擁有對象的變更, 會引起原有對象的引用計數(shù)的減少

get 返回內部對象(指針), 由于已經(jīng)重載了()方法, 因此和直接使用對象是一樣的.如 shared_ptr<int> sp(new int(1)); sp 與 sp.get()是等價的

4. weak_ptr

weak_ptr 是一種不控制對象生命周期的智能指針, 它指向一個 shared_ptr 管理的對象. 進行該對象的內存管理的是那個強引用的 shared_ptr. weak_ptr只是提供了對管理對象的一個訪問手段牍蜂。weak_ptr 設計的目的是為配合 shared_ptr 而引入的一種智能指針來協(xié)助 shared_ptr 工作, 它只可以從一個 shared_ptr 或另一個 weak_ptr 對象構造, 它的構造和析構不會引起引用記數(shù)的增加或減少漾根。weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr相互引用,那么這兩個指針的引用計數(shù)永遠不可能下降為0,資源永遠不會釋放。它是對對象的一種弱引用鲫竞,不會增加對象的引用計數(shù)辐怕,和shared_ptr之間可以相互轉化,shared_ptr可以直接賦值給它从绘,它可以通過調用lock函數(shù)來獲得shared_ptr寄疏。

<pre style="margin: 12px 0px; padding: 0.25em 1em; font-weight: 400; font-size: 14px; position: relative; border-left: 2px solid rgb(26, 188, 156); background: rgb(246, 248, 250); word-break: break-word; font-family: Courier, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: normal; overflow: auto; line-height: 1.45; border-radius: 0px 3px 3px 0px; border-top: none; border-right: none; border-bottom: none; border-image: initial; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">class B;
class A
{
public:
shared_ptr<B> pb_;
~A()
{
cout<<"A delete\n";
}
};
class B
{
public:
shared_ptr<A> pa_;
~B()
{
cout<<"B delete\n";
}
};
void fun()
{
shared_ptr<B> pb(new B());
shared_ptr<A> pa(new A());
pb->pa_ = pa;
pa->pb_ = pb;
cout<<pb.use_count()<<endl;
cout<<pa.use_count()<<endl;
}
int main()
{
fun();
return 0;
}</pre>

可以看到fun函數(shù)中pa ,pb之間互相引用僵井,兩個資源的引用計數(shù)為2陕截,當要跳出函數(shù)時,智能指針pa批什,pb析構時兩個資源引用計數(shù)會減一农曲,但是兩者引用計數(shù)還是為1,導致跳出函數(shù)時資源沒有被釋放(A B的析構函數(shù)沒有被調用)驻债,如果把其中一個改為weak_ptr就可以了乳规,我們把類A里面的shared_ptr pb_; 改為weak_ptr pb_; 運行結果如下,這樣的話合呐,資源B的引用開始就只有1暮的,當pb析構時,B的計數(shù)變?yōu)?淌实,B得到釋放冻辩,B釋放的同時也會使A的計數(shù)減一,同時pa析構時使A的計數(shù)減一拆祈,那么A的計數(shù)為0恨闪,A得到釋放。

注意的是我們不能通過weak_ptr直接訪問對象的方法放坏,比如B對象中有一個方法print(),我們不能這樣訪問凛剥,pa->pb_->print(); 英文pb_是一個weak_ptr,應該先把它轉化為shared_ptr,如:shared_ptr p = pa->pb_.lock(); p->print();

● 怎么判斷一個數(shù)是二的倍數(shù)轻姿,怎么求一個數(shù)中有幾個1犁珠,說一下你的思路并手寫代碼

參考回答:

1逻炊、判斷一個數(shù)是不是二的倍數(shù),即判斷該數(shù)二進制末位是不是0:

a % 2 == 0 或者a & 0x0001 == 0犁享。

2余素、求一個數(shù)中1的位數(shù),可以直接逐位除十取余判斷:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

|

int fun(long x)

{

int _count = ``0``;

while(x)

{

if(x % ``10 == ``1``)

++_count;

x /= ``10``;

}

return _count;

}

int main()

{

cout << fun(``123321``) << endl;

return ``0``;

}

|

● 請回答一下數(shù)組和指針的區(qū)別

參考回答:

指針和數(shù)組的主要區(qū)別如下:

|

指針

|

數(shù)組

|
|

保存數(shù)據(jù)的地址

|

保存數(shù)據(jù)

|
|

間接訪問數(shù)據(jù)炊昆,首先獲得指針的內容桨吊,然后將其作為地址,從該地址中提取數(shù)據(jù)

|

直接訪問數(shù)據(jù)凤巨,

|
|

通常用于動態(tài)的數(shù)據(jù)結構

|

通常用于固定數(shù)目且數(shù)據(jù)類型相同的元素

|
|

通過Malloc分配內存视乐,free釋放內存

|

隱式的分配和刪除

|
|

通常指向匿名數(shù)據(jù),操作匿名函數(shù)

|

自身即為數(shù)據(jù)名

|

● 請你回答一下野指針是什么敢茁?

參考回答:

野指針就是指向一個已刪除的對象或者未申請訪問受限內存區(qū)域的指針

● 請你介紹一下C++中的智能指針

參考回答:

智能指針主要用于管理在堆上分配的內存佑淀,它將普通的指針封裝為一個棧對象。當棧對象的生存周期結束后彰檬,會在析構函數(shù)中釋放掉申請的內存伸刃,從而防止內存泄漏。C++ 11中最常用的智能指針類型為shared_ptr,它采用引用計數(shù)的方法逢倍,記錄當前內存資源被多少個智能指針引用捧颅。該引用計數(shù)的內存在堆上分配。當新增一個時引用計數(shù)加1较雕,當過期時引用計數(shù)減一碉哑。只有引用計數(shù)為0時,智能指針才會自動釋放引用的內存資源亮蒋。對shared_ptr進行初始化時不能將一個普通指針直接賦值給智能指針扣典,因為一個是指針,一個是類宛蚓。可以通過make_shared函數(shù)或者通過構造函數(shù)傳入普通指針设塔。并可以通過get函數(shù)獲得普通指針凄吏。

● 請你回答一下智能指針有沒有內存泄露的情況

參考回答:

當兩個對象相互使用一個shared_ptr成員變量指向對方,會造成循環(huán)引用闰蛔,使引用計數(shù)失效痕钢,從而導致內存泄漏。例如:
image
image
image

上述代碼中序六,parent有一個shared_ptr類型的成員指向孩子任连,而child也有一個shared_ptr類型的成員指向父親。然后在創(chuàng)建孩子和父親對象時也使用了智能指針c和p例诀,隨后將c和p分別又賦值給child的智能指針成員parent和parent的智能指針成員child随抠。從而形成了一個循環(huán)引用:

● 請你來說一下智能指針的內存泄漏如何解決

參考回答:

為了解決循環(huán)引用導致的內存泄漏裁着,引入了weak_ptr弱指針,weak_ptr的構造函數(shù)不會修改引用計數(shù)的值拱她,從而不會對對象的內存進行管理二驰,其類似一個普通指針,但不指向引用計數(shù)的共享內存秉沼,但是其可以檢測到所管理的對象是否已經(jīng)被釋放桶雀,從而避免非法訪問。

● 請你理解的c++中的引用和指針

參考回答:

定義:

1唬复、引用:

C++是C語言的繼承矗积,它可進行過程化程序設計,又可以進行以抽象數(shù)據(jù)類型為特點的基于對象的程序設計敞咧,還可以進行以繼承和多態(tài)為特點的面向對象的程序設計棘捣。引用就是C++對C語言的重要擴充。引用就是某一變量的一個別名妄均,對引用的操作與對變量直接操作完全一樣柱锹。引用的聲明方法:類型標識符 &引用名=目標變量名;引用引入了對象的一個同義詞丰包。定義引用的表示方法與定義指針相似禁熏,只是用&代替了*。

2邑彪、指針:

指針利用地址瞧毙,它的值直接指向存在電腦存儲器中另一個地方的值。由于通過地址能找到所需的變量單元寄症,可以說宙彪,地址指向該變量單元。因此有巧,將地址形象化的稱為“指針”释漆。意思是通過它能找到以它為地址的內存單元。

區(qū)別:

1篮迎、指針有自己的一塊空間男图,而引用只是一個別名;

2甜橱、使用sizeof看一個指針的大小是4逊笆,而引用則是被引用對象的大小岂傲;

3难裆、指針可以被初始化為NULL,而引用必須被初始化且必須是一個已有對象的引用;

4乃戈、作為參數(shù)傳遞時褂痰,指針需要被解引用才可以對對象進行操作,而直接對引用的修改都會改變引用所指向的對象偏化;

5脐恩、可以有const指針,但是沒有const引用侦讨;

6驶冒、指針在使用中可以指向其它對象,但是引用只能是一個對象的引用韵卤,不能 被改變骗污;

7、指針可以有多級指針(**p)沈条,而引用至于一級需忿;

8、指針和引用使用++運算符的意義不一樣蜡歹;

9屋厘、如果返回動態(tài)內存分配的對象或者內存,必須使用指針月而,引用可能引起內存泄露汗洒。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市父款,隨后出現(xiàn)的幾起案子溢谤,更是在濱河造成了極大的恐慌,老刑警劉巖憨攒,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世杀,死亡現(xiàn)場離奇詭異,居然都是意外死亡肝集,警方通過查閱死者的電腦和手機瞻坝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杏瞻,“玉大人所刀,你說我怎么就攤上這事》ズ叮” “怎么了勉痴?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵赫模,是天一觀的道長树肃。 經(jīng)常有香客問我,道長瀑罗,這世上最難降的妖魔是什么胸嘴? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任雏掠,我火速辦了婚禮,結果婚禮上劣像,老公的妹妹穿的比我還像新娘乡话。我一直安慰自己,他們只是感情好耳奕,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布绑青。 她就那樣靜靜地躺著,像睡著了一般屋群。 火紅的嫁衣襯著肌膚如雪闸婴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天芍躏,我揣著相機與錄音邪乍,去河邊找鬼。 笑死对竣,一個胖子當著我的面吹牛庇楞,可吹牛的內容都是我干的。 我是一名探鬼主播否纬,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吕晌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烦味?” 一聲冷哼從身側響起聂使,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谬俄,沒想到半個月后柏靶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡溃论,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年屎蜓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钥勋。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡炬转,死狀恐怖,靈堂內的尸體忽然破棺而出算灸,到底是詐尸還是另有隱情扼劈,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布菲驴,位于F島的核電站荐吵,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜先煎,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一贼涩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧薯蝎,春花似錦遥倦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至消略,卻和暖如春统诺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疑俭。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工粮呢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钞艇。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓啄寡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哩照。 傳聞我的和親對象是個殘疾皇子挺物,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容

  • 過得每一天都比以前努力。最近看簡書的文章覺得上首頁的文章飘弧,并不是寫的很好识藤。自己每天也堅持閱讀,準備過年的時候能給自...
    曾曾的麻麻閱讀 173評論 0 0
  • 一個男性朋友昨晚在說說里發(fā)表了這樣一段話次伶,說是段還有些太過牽強了其實就是一句話痴昧。 “可能他窮他丑他矮所...
    吳小姐閱讀 401評論 0 3
  • 思維導圖如何運用于英語學科呢?這是我們要分享的冠王。 學科思維導圖與傳統(tǒng)思維導圖是有一定差異的赶撰。傳統(tǒng)思維導圖...
    寧歌911閱讀 248評論 0 0
  • 在2016年8月豪娜,《新英格蘭醫(yī)學雜志》上發(fā)表了一篇引人注目的報告,報告內容是關于癌癥和身體脂肪的關系哟楷。 目前瘤载,13...
    我微微一笑閱讀 1,209評論 1 4