C 基礎語言篇(一)

2021-09-24 05:01:56 字數 3081 閱讀 6312

1. 說一下static關鍵字的作用

全域性靜態變數

區域性靜態變數

靜態函式

類的靜態成員

類的靜態函式

2. 說一下c++與c的區別

設計思想

物件導向與面向過程

語法上

3、 說一下c++中四種cast轉換

const_cast

將const變數轉為非const

static_cast

用於各種隱式型別轉換,比如非constz轉const,void*轉指標等,static_cast能用於多型向上轉化,如果向下轉能成功但是不安全,結果未知

dynamic_cast

用於動態型別轉換。只能用於含有虛函式的類,用於類層次間的向上和向下轉化。只能轉指標或引用。向下轉化時,如果是非法的對於指標返回null,對於引用拋異常。要深入了解內部轉換的原理。

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

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

它通過判斷在執行到該語句的時候變數的執行時型別和要轉換的型別是否相同來判斷是否能夠進行向下轉換。

reinterpret_cast

幾乎什麼都可以轉,比如將int轉指標,可能會出問題,盡量少用;

為什麼不使用c的強制型別轉換

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

4、 請說一下c/c++ 中指標和引用的區別?

指標有自己的一塊空間,而引用只是別名

使用sizeof看乙個指標的大小是4,而引用則是被引用物件的大小;

指標可以被初始化為null,而引用必須被初始化且必須是乙個已有物件 的引用;

作為引數傳遞時,指標需要被解引用才可以對物件進行操作,而直接對引 用的修改都會改變引用所指向的物件;

可以有const指標,但是沒有const引用;

指標在使用中可以指向其它物件,但是引用只能是乙個物件的引用,不能 被改變;

指標可以有多級指標(**p),而引用至於一級

指標和引用使用++運算子的意義不一樣;

如果返回動態記憶體分配的物件或者記憶體,必須使用指標,引用可能引起記憶體洩露。

5、 給定三角形abc和一點p(x,y,z),判斷點p是否在abc內,給出思路並手寫**

面積法:根據面積法,如果p在三角形abc內,那麼三角形abp的面積+三角形bcp的面積+三角形acp的面積應該等於三角形abc的面積

6、請你說一下你理解的c++中的smart pointer四個智慧型指標: shared_ptr,unique_ptr,weak_ptr,auto_ptr

為啥使用智慧型指標

auto_ptr(c++98,c11棄用)

採用所有權模式

auto_ptr< string> p1 (

new string ("i reigned lonely as a cloud.」));

auto_ptr p2;

p2 = p1;

//auto_ptr不會報錯.

此時不會報錯,p2剝奪了p1的所有權,但是當程式執行時訪問p1將會報錯。所以auto_ptr的缺點是:存在潛在的記憶體崩潰問題!

unique_ptr(替換auto_ptr)

unique_ptr實現獨佔式擁有或嚴格擁有概念,保證同一時間內只有乙個智慧型指標可以指向該物件。它對於避免資源洩露(例如「以new建立物件後因為發生異常而忘記呼叫delete」)特別有用。

unique_ptr p3 (

new string (

"auto"))

;//#4

unique_ptr p4; //#5

p4 = p3;

//此時會報錯!!

unique_ptr

pu1(

new string (

"hello world"))

;unique_ptr pu2;

pu2 = pu1;

// #1 not allowed

unique_ptr pu3;

//只是個臨時的右值,允許這麼做

pu3 = unique_ptr

(new string (

"you"))

;// #2 allowed 呼叫的是建構函式,構造之後的臨時物件會銷毀

c++11中的移動語義,unique_ptr的賦值

unique_ptr ps1, ps2;

ps1 =

demo

("hello");

ps2 =

move

(ps1)

;ps1 =

demo

("alexia");

cout <<

*ps2 <<

*ps1 << endl;

shared_ptr

weak_ptr

7、 怎麼判斷乙個數是二的倍數,怎麼求乙個數中有幾個1,說一下你的思路並手寫**

即判斷該數的二進位制的末尾是不是1

轉化為unsigned int 然後與1相與

8、 指標和陣列的區別

指標陣列

儲存資料的位址

儲存資料

間接訪問資料,首先獲得指標的內容,然後將其作為位址,從該位址中提取資料

直接訪問資料,

通常用於動態的資料結構

通常用於固定數目且資料型別相同的元素

通過malloc分配記憶體,free釋放記憶體

隱式的分配和刪除

通常指向匿名資料,操作匿名函式

自身即為資料名

9、請回答野指標是什麼

10、請你回答智慧型指標有沒有記憶體洩漏

兩個物件相互使用乙個share_ptr成員變數指向對方,會造成迴圈引用,使得引用計數失效,導致記憶體洩漏

11、 請你來說一下智慧型指標的記憶體洩漏如何解決

為了解決迴圈引用導致的記憶體洩漏,引入了weak_ptr弱指標,weak_ptr的建構函式不會修改引用計數的值,從而不會對物件的記憶體進行管理,其類似乙個普通指標,但不指向引用計數的共享記憶體,但是其可以檢測到所管理的物件是否已經被釋放,從而避免非法訪問。

c語言基礎篇(一)

一 基本資料型別 整型 int 實型 float double 字元型 char 這些資料型別是用來修飾 變數 程式執行過程中可以改變的量 二 變數的命名規則 1.以字母丶下劃線開頭,中間可以包含數字,但不能以數字開頭 2.可以使用美元符號開頭 但不建議 3.見名知意 4.不可使用系統保留字 三 賦...

C語言基礎篇(一)

計算機只能識別0和1,所有資料在計算機中以二進位制形式儲存,想要學好計算機就要先掌握數制間的轉換。常見的數制有二進位制,八進位制,十進位制,十六進製制。1.十進位制轉為二進位制 a.寫出2 n b.用所求十進位制數與2 n比較,若大於等於記1,減去2 n,小於記0 c.所得數再與2 n 1 比較 同...

C 語言基礎篇

一 型別轉換 在 c 中,變數分為以下幾種型別 1.值型別變數可以直接分配給乙個值。它們是從類system.valuetype中派生的。值型別直接包含資料。比如int char float,它們分別儲存數字 字元 浮點數。當您宣告乙個int型別時,系統分配記憶體來儲存值。2.引用型別不包含儲存在變數...