c 基礎知識總結

2021-07-12 05:09:16 字數 4221 閱讀 9916

建構函式

1.建構函式沒有返回值,函式名就是類名

2.建構函式可以過載,以滿足對物件不同引數的需求。實參決定了呼叫哪個建構函式

3.建構函式在定義物件的時候由系統自動呼叫。且每個物件只呼叫一次。

4.無參建構函式和全預設建構函式都是預設建構函式,且這倆只能存在乙個(二義性問題)

5.建構函式不可以用const修飾,因為常函式無法修改其值。

6.如果沒有顯式定義,系統會自動生成乙個預設建構函式,但是這個建構函式什麼了不會做。

預設建構函式

如果沒有顯示定義乙個建構函式,系統會自動生成乙個預設建構函式,但是這個預設建構函式什麼也不會做。即使該建構函式什麼也不做,編譯器也不會為該類合成預設的建構函式。編譯器生成的預設建構函式使用與變數初始化相同的規則來初始化成員,具有類型別的成員通過執行各自的預設建構函式來進行初始化。內建和符合型別的成員如指標、陣列,只對定義在全域性作用域中的物件初始化,當物件定義在區域性作用域時,內建和符合型別的成員不進行初始化。在某些情況下,預設建構函式是由編譯器隱式使用的。

拷貝建構函式(建立物件的時候用構造,複製物件的時候用複製構造)

引數只有乙個,就是const型的物件引用(如果不傳引用作為引數,那麼傳入的是乙份臨時拷貝,而臨時拷貝需要構建物件,又需要呼叫拷貝建構函式,造成無限遞迴)

是建構函式的過載

如果沒有定義,會預設合成乙個(合成的拷貝建構函式會進行簡單的拷貝)

使用場景:

1、物件例項化物件

cdate d1(1990, 1, 1);

cdate d2(d1);

2、傳值方式作為函式的引數

void funtest(const cdate date)

{} 3、傳值方式作為函式返回值

cdate funtest()

析構函式

析構函式:與建構函式功能相反,在物件被銷毀時,由編譯器自動呼叫,完成類的一些

資源清理和汕尾工作

乙個類裡面只有乙個,物件被銷毀的時候只呼叫一次。

析構順序:函式放在棧上,先進後出,所以對後進的函式先進行析構。

this指標

1.this指標是存在於類的非靜態成員函式內部的,指向類的物件。但它並不屬於物件,不能影響sizeof的結果

2.指標的型別是 型別*const

3.以函式的第乙個隱式引數的方式存在於函式內。

4.它在函式呼叫前生成,呼叫結束後銷毀。生命週期和函式一樣

5.當函式的引數個數一定的時候,通過ecx傳參,否則等所有引數壓棧後壓如堆疊。

6.建構函式的初始化列表中不可以使用this指標,因為構建物件還未完成,不知道物件的具體結構。

1.成員變數和成員函式的儲存是不一樣的,因為多個物件的成員變數是不同的,而他們的成員函式除了變數,都是相同的,為了節省空間,成員函式只存了乙份

sizeof(物件),大小為成員變數的大小(考慮對齊),如果函式有virtual修飾的時候,大小還要加4.

thiscal呼叫約定

1.函式引數從右往左壓棧

2.當函式的引數個數一定的時候,this通過ecx傳參,否則等所有引數壓棧後壓如堆疊。

3.函式引數個數不一定,呼叫結束後呼叫者清除堆疊,否則,該函式自己清。

友元函式

有元函式不屬於類,但是宣告在類裡面(可以定義在類裡面,前加friend,可以定義在類外面,不加friend)

乙個友元函式可以是多個類的友元函式

友元函式不能用const修飾(const修飾的函式,變數的成員不可改變)

友元函式和普通函式的呼叫一樣,原理也一樣

友元類

宣告乙個類是另乙個類的友元類,那麼這個類可以訪問另乙個類的私有屬性的成員變數

注意點:友元類是單向的(a是b的友元類,b不可以是a的友元類);友元類不可傳遞(a是b的,b是c的,a不是c的);友元類不可繼承

優點:提高**的效率(因為可以直接訪問私有屬性的物件成員,省去了函式呼叫的耗時)

缺點:破壞了類的封裝性

操作符過載(過載有兩種形式,過載為類的成員函式,過載為友元函式,看情況選擇)

1.:: . .* ?:不能被過載(除了=外,基類中過載的所有操作符都將被派生類繼承)

2.操作符過載函式中必須有乙個類型別或者列舉型別變數

用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不能改變其含義

3.過載前後操作符的優先順序和結合性是不變的

4、不在具備短求職特性

過載操作符不能保證操作符的求職順序,在過載&&和||中,對每個運算元

都要進行求值,而且對運算元的求職順序不能做規定,因此:過載&&、

||和逗號操作符不是好的做法。

5、作為類成員的過載函式,其形參看起來比運算元數目少1

成員函式的操作符有乙個預設的形參this,限定為第乙個形參。

6、一般將算術操作符定義為非成員函式,將賦值運算子定義成員函式

7、操作符定義為非類的成員函式時,一般將其定義為類的友元

8、== 和 != 操作符一般要成對過載

9、下標操作符:乙個非const成員並返回引用,乙個是const成員並返回引用

10、解引用操作符*和->操作符,不顯示任何引數

11、自增自減操作符

前置式++/–必須返回被增量或者減量的引用

字尾式操作符必須返回舊值,並且應該是值返回而不是引用返回

12、輸入操作符》和輸出操作符《必須定義為類的友元函式

13.預設情況下,&和,與內建操作符實現方式一樣。=則不會進行過載,而是把每一項進行賦值。

14.過載逗號、取位址、邏輯與、邏輯或等等操作符通常不 是好做法。這些操作符具有有用的內建含義,如果我們 定義了自己的版本,就不能再使用這些內建含義。

static

1.宣告為static的類成員(成員資料或成員函式)稱為類的靜態成員(可用來計算建立物件的個數 )

2.static在類內只是宣告,需要在類外定義,類外定義是不帶static(static屬於類,但不屬於物件,所有物件共用)

3.對靜態成員的呼叫方式有兩種:(兩種方式在底層的實現方式相同)

4.靜態成員函式不能訪問非靜態成員變數(要以把物件對位引數的方式訪問)

原因:靜態函式中沒有this指標(因為static函式是共享的,加this的話並不知道是誰的this)

5.靜態成員函式呼叫方式為_cdcal

6.靜態成員和類的普通成員一樣,也有public、protected、private3種訪問級別,也可以具有返回值,const修飾符等引數。

7.靜態成員變數的儲存在今天區,和成員函式一樣是被各物件共用的。

靜態成員函式不可以呼叫非靜態成員函式(沒有this指標,只可以訪問靜態成員)

非靜態成員函式可以呼叫類的靜態成員函式()

const

1、const修飾形參,一般和引用同時使用

2、const修飾返回值

3、const修飾類資料成員,必須在建構函式的初始化列表中初始化

4、const修飾類成員函式,實際修飾隱含的this,表示在類中不可以對類的任何成員進行修改

5、在const修飾的成員函式中要對類的某個資料成員進行修改,該資料成員定義宣告是必須加mutable關鍵字

6.c中const修飾的變數為不可修改的變數

c++中,修飾的該變數是乙個常量

-建構函式不能通過const來修飾(建構函式是用來初始化物件的,會對成員變數做出修改,並且在初始化列表中,this還沒有成型)

-const物件(型別為const date*const this)可以呼叫非const成員函式(型別為date*const this )和const成員函式(型別為const date*const this) 嗎,

不可以,可以(型別匹配問題,非const可能會改變const物件的內容)

- 非const物件可以呼叫非const成員函式和const成員函式嗎,

可以 - const成員函式內可以呼叫其它的const成員函式非const成員函式嗎?

可以,不可以(害怕內容被改)

- 非const成員函式內可以呼叫其它的const成員函式非const成員函式嗎?

可以

C語言基礎知識總結

第一章 軟體是一系列按照特定順序組織的計算機資料和指令的集合。程式是計算機指令的序列。語言有三種 機器語言 組合語言 高階語言。乙個簡單的程式設計一般包含四個步驟 1.分析問題,建立數學模型。2.確定資料結構和演算法。3.編制程式。4.調製程式。演算法的基本特徵 有窮性 確定性 有效性 有零個或多個...

C 學習基礎知識總結

結束當前視窗 close 字元擷取 string get year get sfz.substring 6,4 當前時間年份 datetime.now.year 型別轉換 convert.toint32 year textbox3.text convert.tostring i1 i2 判斷輸入是否...

C 演算法基礎知識總結

打算刷leetcode,有些放不下python和c 這兩種語言,常有些人說用python刷演算法是作弊。感覺有些道理吧,這不認真複習一下c 的基礎。標頭檔案 include 使用 vector name 訪問方式 下標訪問和迭代器訪問 迭代器訪問 for vector int iterator it...