C 類中的函式

2021-10-02 08:24:48 字數 2095 閱讀 8649

類的訪問修飾符

private :私有成員,僅類內可見,類成員預設是私有的

protected :受保護的成員,類內和子類可見

public :公有成員,對外可見

訪問修飾符的作用範圍是到下個訪問修飾符或者到類的結尾

友元函式

#include

using

namespace std;

class

test

friend

intmain()

;// 宣告主函式為友元函式,說到底主函式也是函式

friend

intgetint()

;// 宣告一般函式為友元函式,用法與其他函式一樣,只是需要在類內宣告一下

friend

double

getdou

(test t)

;// 帶有形參的友元函式

friend

classa;

// 類內宣告友元類,類內所有成員對友元類都是可見的

protected

:double d;

private

:int n;};

classa}

;int

getint()

double

getdou

(test t)

intmain()

注意

類的友元函式不受類的訪問修飾符的限制(可以寫在 private 的作用範圍內,可以寫在 protected 的作用範圍內,可以寫在 public 的作用範圍內)

友元函式和友元類會破壞類的封裝性,通常情況下會定義 get…(); set…(); 這類介面函式對類的私有成員進行訪問

類外訪問私有成員用友元函式,類外訪問受保護成員用友元函式或子類

#include

using

namespace std;

class

test

void

show()

void

func1()

const

void

func2()

const

;private

:int n;

double d;};

void test::

func2()

const

intmain()

class

test

void

show()

void

show()

const

private

:int n;};

test t;

t.show()

;const test ct;

ct.show()

;// 執行結果:

// non-const: 2

// const: 2

內聯函式和常規函式的區別

內聯函式:在函式的宣告和定義的位置同時加上 inline ,將函式定義為內聯函式,只在宣告位置寫 inline 是不管用的,在函式編譯的時候呼叫內聯函式的位置會被相應的**替換,執行時就避免了函式呼叫的跳轉和保護現場給系統帶來的開銷

如何選擇是否用內聯函式

注意

內聯函式和巨集函式有些類似,都是在程式編譯的時候進行**段的替換,但內聯函式解決了巨集函式的一些缺點,內聯函式可以除錯,而且內聯函式可以作為類的成員函式,訪問類的私有成員

即使是將函式定義為內聯函式,編譯器也不一定會將其作為內聯函式進行編譯,若函式體比較大,或者有遞迴之類的複雜結構,編譯器一般不會將其編譯為內聯函式,反而對於一些函式體比較小,結構簡單,呼叫頻繁的普通函式,編譯器可能將其優化為內聯函式

對於函式體比較大,或者含有遞迴等複雜結構的函式,一般不能定義為內聯函式,即使定義了編譯器也不會認的,當做普通函式處理了

內聯函式可以作為類的成員函式,也可以不作為成員函式單獨出現

C 類中的函式過載

1,本課程最初階段就學習了函式過載,但是那時研究目標僅限於全域性函式,到目前 為止我們學習了三種函式 1,全域性函式 2,普通成員函式 3,靜態成員函式 這三種不同型別的函式之間是否可以構成過載,這是本文討論的主要內容 2,函式過載回顧 1,函式過載的本質為相互獨立的不同函式 2,c 中通過函式名和...

C 類中函式指標的用法

原有的程式是利用一台pc機的共享記憶體來實現兩個程式間的通訊的,最近要求改了,要設計2臺pc間這兩個的程式的通訊,想把通訊部分的程式做成類封裝起來。其中,由於要有多執行緒的部分。就是說,可能在乙個執行緒裡讀,在另乙個執行緒裡寫。所以得用到類成員函式的函式指標部分。為了驗證可行性,編寫了下面的程式 c...

C 空類中的預設函式

參加面試的時候,面試官問到這個問題,我的回答 預設建構函式 預設析構函式 預設拷貝建構函式 預設賦值函式。現在回想起來感覺不對,就google,揭示一下這個看似簡單的問題 乙個空的class在c 編譯器處理過後就不再為空,編譯器會自動地為我們宣告一些member function,如果你寫 clas...