C 一些重要知識點的個人理解

2021-10-06 21:08:29 字數 4584 閱讀 8171

總算是考完c++了,前前後後為這門課花費了很多的時間和精力,課程裡面的知識點也是巨多巨雜,看完ppt的內容,總是後面部分看完前面的就忘差不多了,哭泣…

為了讓自己可以及時地掌握一些比較重要的知識點,特地建了個文件,把一些知識點的個人理解放了進去,下面通過部落格發出來和大家一起分享。

自己也是初學者,可能有些內容並不準確,還請批評指正,謝謝。

虛繼承主要就是為了解決在繼承中的二義性問題

何為二義性問題呢?就是當乙個類繼承兩個類的時候,這兩個類可能含有相同的屬性和方法,在這個類的物件進行訪問其中的屬性的時候就不知道該訪問哪個類的屬性或者方法。業績就會產生歧義。

如果不通過虛繼承的方式,那麼在呼叫的時候就需要把具體的類加上域作用符,這樣才能知道我在呼叫的時候使用的是哪個類。

那麼虛繼承就可以解決這樣的乙個問題,在中間的那兩個類向上繼承某個類的時候,我再繼承這兩個類,在虛繼承的背景下,我只會呼叫乙個建構函式,不會造成歧義。

多型是物件導向 繼承、封裝、多型幾大基本特性的一種,多型把,主要就是有兩種形式,一種是過載(靜態聯編/前期聯編),一種就是重要的虛函式(動態聯編/後期聯編)

兩種方式的差異主要就是在編譯的時候過載就已經知道會呼叫哪個重名函式,但是虛函式則不同,它只有當執行的時候才可以明確知道。

關於運算子過載,這裡主要就是將運算子作為一種函式,而運算子過載的實質實際上就是函式的過載。

而運算子的過載主要就是有兩種方式,一種是過載為類的成員函式的形式,這種形式是含有this指標的,我們需要做的就是給出符號右邊的定義即可;

另一種就是過載為友元函式,當我們採用這樣的過載時需要給出類的左右兩邊的定義,是的,兩邊的定義都要給出來才行,這時候才可以有諸如c1 + 27 / 27 + c1這般操作。

這裡說明一下在運算子過載中,經常會用到的兩種方式,一種是成員函式的過載方式,另一種是友元函式的過載方式,如果過載為成員函式呢,那麼預設這個函式是可以進行呼叫這個類的相關變數的,因為會通過this指標進行,但是過載為友元函式時(常常作為二元運算子使用時)這時候我們的函式說明是在類外進行的,所以我們就不能通過this指標來傳參,這時候最好就是申明兩個類的物件,通過物件來進行傳參。

首先我們要知道的是虛函式也是成員函式的一種。

為什麼需要虛函式呢?因為當我們有乙個基類還有乙個派生類,當基類的指標指向派生的物件的時候,我們是可以通過指標訪問基類的資料成員的,但是,我們卻不能通過基類的指標訪問派生類的成員函式。

為了能夠通過基類的 指標/引用 來訪問派生類的成員函式,那麼這時候虛函式就派上用場了,通過對基類中的同名函式加乙個virtual關鍵字,在派生類中的相同名字的函式就是虛函式,此時不加virtual關鍵字也不影響了。

這時我們通過在類外定義乙個可以通過基類引用訪問基類成員函式的函式,當我們把這個函式作用於派生類的同名函式時就不會出錯,也可以這樣使用。即可以實現乙個介面,多種用途的功能了。

注意虛函式的形式必須保持完全一致,如果將引數個數、返回型別等等,有任何乙個不一致,那麼就不是真正的虛函式,即使寫上了virtual關鍵字,也不會進行動態聯編。

當乙個父類的指標指向乙個子類的物件時,除了會在成員函式的呼叫上產生問題,也會在物件的析構上產生問題。當使用delete刪除基類指標指向的子類動態物件時,呼叫的是基類的析構函式。所以這時候虛函式就顯得很重要了,當把基類的析構函式加上virtual關鍵字時,那麼這個析構函式就變成了虛函式了,當我們再使用delete刪除基類指標刪除指向的子類物件時,呼叫的就是子類物件的析構函式。為了方便起見,在需要多型的場合,一般我們是把析構函式直接定義為虛函式,不管有沒有用。

內聯函式、靜態成員函式、建構函式都不能宣告為虛函式

指標是c語言的靈魂,而虛函式是c++的靈魂

通過基類的指標和引用配合虛函式才可以構成動態多型,所以最好宣告為public,以供指標或者引用呼叫。可以申明為private和protected,語義上沒問題,但是這樣就沒什麼意義了。

抽象類最直觀的感受就是他不能夠例項化,但是可以說明指向抽象類的指標和引用,這個指標可以指向由抽象類繼承過去的派生類物件

包含純虛函式的類為抽象類,抽象類至少含有乙個純虛函式,那麼什麼是純虛函式?純虛函式是一種特殊的虛函式,在很多情況下我們在基類中不能在虛函式中給與有意義的實現,而把它說明未純虛函式,把它的實現留給基類的派生類去實現,相當於為派生類提供了乙個框架。如純虛函式:virtual float area() const = 0; // 純虛函式

當抽象類的所有成員函式都是純虛函式時,那麼這個類就被稱為介面類

因為c++乙個重要的性質就是多型,也就是**的重用,但是很多情況下,當我們使用的引數型別不一致的時候,**也需要根據引數的不同型別進行適應性的修改,否則就會報錯,而函式模板就是這種解決同名函式,相同實現**,但是可以根據引數型別進行動態變化的一種解決方式。

同時呢,函式模板不能直接使用,需要進行例項化之後才可以進行使用,有點類似於類的那種意思。另外,當把函式模板在標頭檔案中進行定義的時候,不能只保留函式模板的頭,而把實現放在另乙個檔案中,因為函式模板本身並不是乙個具體的函式,那麼在定義標頭檔案的時候用到函式模板就需要將函式模板的整體全部包含進去。

當引數型別不一致的時候可以有兩種方式解決:一種是函式模板可以使用多個模板引數,另一種就是過載模板函式。使用多個模板引數,一般是相同的引數型別,但是引數個數不受到具體的限制。而過載模板函式的話就是和前面講到的過載函式基本類似,也就是說定義好了乙個模板,那麼這個模板並不是死的,還可以進行過載,使其具有更多的表現形式。

一般來說我們定義函式模板的時候,引數的型別是一樣的,但是當函式的引數不一樣時,再使用這個函式模板就會出現錯誤。這是我們需要對函式模板進行適當的修改,比如可以使用兩個型別引數的模板,如

template

t max(t a,d b)

當為乙個函式引數型別時:

template

t max(t a,t b)

注:定義的型別引數在函式的引數上必行進行體現,少乙個或者多乙個都是不可以的。

注:在template< class t >和template< typename t>這兩種情形中,很容易造成誤解,誤解的原因就是將t的型別作為class了,但是這樣理解就把t作為了乙個類似於int t 這樣的一種變數,我自己覺得最好的理解就是將兩者進行等價處理。即,class = t ,typename = t,這樣的話就好理解點。

類模板的話不是一各具體的類,而是一類類,所以可以實現的功能也就更多了。分為類模板體內定義成員函式,和類模板體外定義成員函式。在體外定義成員函式以及在體外生成物件的時候主要把函式的引數形式進行對應上。

諸如:myclassobj1(3,7.3) pair< int >obj1;等等

內聯函式的一大作用就是提高**的效率,在編譯和使用的時候節省了引數傳遞的開銷,把函式體直接嵌入到函式的內部進行操作。

c語言中是 不允許有相同的函式名的,但是在c++中卻是可以的,這主要就是過載在其中的作用,c++的過載最好就是執行相類似的功能,如果利用過載去執行不相同的功能,總是不好的。另外,過載不能僅僅是返回值型別不同構成的過載,至少要是引數的型別、順序、個數等有一些明顯的變化,否則無法構成過載。

我們知道在c/c++中陣列在定義的時候就已經確定好陣列的大小了,換句話說也就是陣列的這個大小是靜態的,是不能改變的。但是在程式執行中,我們不知道會占用多少記憶體時,這種提前設定好的靜態記憶體就會產生開銷過大或者開銷太小的問題,這時我們需要一種動態的記憶體分配來解決這樣乙個問題,那麼堆記憶體就是這樣一種動態的記憶體形式。

c語言中就要就是通過malloc和free函式進行實現,malloc函式執行成功之後返回記憶體空間的首位址,這時需要乙個指標來指向這個記憶體空間的首位址,因為malloc返回的指標型別是void型的,所以我們需要通過型別轉換變成其他的型別。那麼當記憶體分配失敗的時候malloc函式返回的是null。這裡需要注意的是,在使用malloc申請了一定的記憶體空間後,務必記得要用free來進行記憶體空間的釋放,而free釋放的只是那個指標指向的內容,指標本身還是指向原來的位置,我們在free掉指標指向的內容後記得把指標的值置為null。

c++中主要就是通過new和delete來實現動態記憶體的分配和釋放。在使用new的時候需要通過乙個指標來指向new之後的記憶體空間,在釋放的時候我們通過delete來進行釋放,這裡delete釋放也是有兩種形式,一種是釋放資料型別的指標,採用delete+指標,另一種的形式就是指標使用delete+指標。釋放後把指標指向null。

引用在直觀上的理解就是給我們要引用的變數起乙個別名,對這個引用的操作,實際上就是對被引用的變數本身進行操作,換湯不換藥這種感覺。平時我們可能覺得引用沒有什麼大的用處,但是引用在作為函式引數的時候可以有很好的用處,這個用處就是傳遞的函式引數不再是原有變數的乙個拷貝或者說是乙個副本,傳遞進去的就是變數本身,所以可以簡單理解為就是這個變數本身在參與計算和執行。同時需要注意的就是在函式中返回乙個引用的時候最好是乙個全域性變數的引用,避開乙個區域性變數的引用。

引用和指標的功能作用有點類似,不過指標需要知道變數的位址,之後才能進行對變數的操作。而引用相比較而言就顯得比較簡單了。

hadoop中的一些重要知識點

2 resourcemanger rm 為該程式分配第乙個container,並與對應的nodemanger通訊,要求它在這個container中啟動應用程式am。3 am首先向rm註冊,這樣使用者可以直接通過rm檢視應用程式的執行狀態,然後將為各個任務申請資源,並監控它的執行狀態,直到執行結束,重...

C 的一些知識點

include using namespace std 內聯函式,交換兩個數的值 建議直接定義,不用先在開頭宣告再在後面定義 inline void swap int a,int b int main int p newint 分配1個int型的記憶體空間 delete p 釋放記憶體 int p ...

一些知識點

字串拼接 1.a join b a為元素之間的分隔符,b為待分割的序列 可用於輸出時的資料處理,元素間有空格,末尾沒有 2 s s s str1,str2,str3 前半部分為字串,後半部分為索引。用於引入,s是物件 3.format str1,str2,str3 與f 括號裡為已有變數 關於for...