類的訪問修飾符
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...