● 說一下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ù)表>);
為大家準備了很多面試資料和學習入門+進階+深入的資料碰凶,關注公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ù)失效痕钢,從而導致內存泄漏。例如:上述代碼中序六,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)內存分配的對象或者內存,必須使用指針月而,引用可能引起內存泄露汗洒。