C 入門教程(七十三) 前置宣告和友元宣告

2021-08-18 09:04:23 字數 1712 閱讀 5854

小古銀的官方**(完整教程):

友元宣告

#include // 前置宣告

class b;

class a

;class b

;int main(void)

類a和類b相互使用對方的指標,由於類b在類a後面,如果沒有前置宣告的話,那麼編譯的時候,編譯器就會報錯,說類a中的型別b沒有定義。**中的class b;就是類b的前置宣告。

我們知道每乙個類,多多少少都會有私有或者保護的成員。有時候會有這種情況,需要宣告定義乙個非類成員的函式,然後這個函式還要訪問類的私有或者保護的成員。這時候需要使用關鍵字friend

現在舉個簡單的例子說明非類成員的函式怎樣訪問類的私有或者保護的成員:

#include #include class testclass

;void set_text(testclass &test, const std::u32string &text); // 宣告二

void error_set_text(testclass &test, const std::u32string &text); // 宣告三

int main(void)

void set_text(testclass &test, const std::u32string &text)

void error_set_text(testclass &test, const std::u32string &text)

只需要將函式set_text()的宣告放在類裡面(無論是放在哪個訪問限制都可以),並且在宣告的開頭加上friend,那麼這個函式就算不是成員函式,但也能通過物件訪問物件的私有或者保護成員。例如**中的函式set_text()裡面可以通過物件test操作其私有的成員變數m_value。而friend只能夠加在函式宣告的前面,而不能夠加在函式定義的前面。

雖然函式set_text()的宣告放在類裡面,但是它的確已經宣告了,所以**中的宣告二可以省略。

而函式error_set_text()沒有在類裡面宣告為friend,所以如果去掉函式error_set_text()裡的**注釋,將會編譯報錯,提示不能訪問私有成員。

#include class testclass

std::u32string m_value;

};int main(void)

上面**是把函式set_text()的宣告和定義都放在類裡面,但是函式set_text()仍然是全域性函式。

class a

;class b

;int main(void)

把類b的前置宣告寫到類a裡面,並且在前置宣告前面加上friend說明類b是類a的友元類,這樣類b就可以訪問類a中的私有或者保護的成員。上面**中類b可以訪問類a的成員型別int_type,並且有這個型別宣告了私有成員變數value

C 入門教程(五十三) 類的宣告和定義

小古銀的官方 完整教程 宣告成員變數 基礎講解 宣告定義成員函式 鞏固練習 在之前的教程中我們使用過無數次的類,尤其以字串居多。在我們寫程式的時候,會越寫越多,這時候為了方便閱讀和重複利用,會從一堆 中找出可以單獨成功能的 並將這些 封裝成函式 當 量真的很多的時候,還是不容易理解,這時候還是為了方...

C 入門教程(三) 語句和縮排

小古銀的官方 完整教程 再看看前面的 include int main void 除了特殊說明外,一般,一條語句都是以乙個分號 結尾。例如上面的std cout 小古銀的c 教程 std endl 是一條語句 return 0 也是一條語句。最短的語句就是乙個分號 它沒有其他內容。至於其他幾個不是分...

C 入門教程(3) 語句和縮排

小古銀的官方 完整教程 再看看前面的 include int main void 除了特殊說明外,一般,一條語句都是以乙個分號 結尾。例如上面的std cout 小古銀的c 教程 std endl 是一條語句 return 0 也是一條語句。最短的語句就是乙個分號 它沒有其他內容。至於其他幾個不是分...