1. 程式人生 > >模板類與友元函式

模板類與友元函式

模板的友元可以分為三類:

  • 非模板友元
  • 約束模板友元,即友元的型別取決於類被例項化時的型別
  • 非約束模板友元,即友元的所有具體化都是類的每一個具體化的友元

1. 模板類的非模板友元,即該友元函式不存在模板,但是該友元函式聲明於一個模板類中。


圖1

如果沒有需要模板類引數,這與普通的類中的友元函式沒啥差別。


圖2 圖3
由於不存在物件A,而只存在A<T> 即該模板類的一個例項,所以上圖中是一個錯誤的事例,機會出現圖三所示的相關提醒。


圖4

如果該友元函式需要該模板類引數,就將與約束模板友元類似了。因為該函式將與例項化的模板相關。

2. 約束模板友元,即該友元函式自身是一個模板函式,並且受到該模板類的約束。


圖5

需要在模板類之前宣告模板函式。圖5中可以看出,友元函式均與每一個具體的例項化相關,即會根據模板類中的型別T變換而變換。 

3. 非約束模板友元,該友元函式存在模板,但是並不受該模板類的約束。


圖6

該模板友元函式的宣告放在了模板類中,且該友元函式模板型別與模板類的型別並沒有相同之處,也就不會受到模板類的約束。

相關推薦

模板函式

模板的友元可以分為三類: 非模板友元約束模板友元,即友元的型別取決於類被例項化時的型別非約束模板友元,即友元的所有具體化都是類的每一個具體化的友元 1. 模板類的非模板友元,即該友元函式不存在模板,但是該友元函式聲明於一個模板類中。 圖1 如果沒有需要模板類引數,這與

關於模板函式的宣告定義

//Widget.h #ifndef _WIDGET_H_ #define _WIDGET_H_ #include <iostream> using namespace std; template<class T> class Widget {

c/c++ 模板STL小例子系列<二> 模板函數

vat stream col ons cout include ios ring 沒有 c/c++ 模板與STL小例子系列<二> 模板類與友元函數 比如某個類是個模板類D,有個需求是需要重載D的operator<<函數,這時就需要用到友元。 實現這樣

函式的繼承傳遞問題

    C++ Primer中有如下描述:友元關係不能被繼承,基類的友元對派生類沒有特殊的訪問許可權。     然而通過實踐發現,VS編譯器並沒有安裝上述描述來處理,下面的規則與上述描述相悖,卻符合VS編譯器的處理規則。     注:有待通過g++編譯器來驗證。 1 友元

的預設成員函式函式

在C++中,類與C語言中的結構體類似,類與結構體的不同之處便是在其內部多了幾個成員函式還有幾個訪問限定符,訪問限定符有public(公共)、protected(保護)、private(私有),而成員函式總的來說共包括六大類,他們便是類與結構體的不同之處,六大預設

C++模板中的函式的宣告和定義分別放在哪裡

        前面提到了模板的宣告和定義推薦都放在標頭檔案中,那麼該類中的友元函式的宣告和定義該放在哪裡呢?         因為友元函式並不屬於這個類, 按照習慣,我們一般把宣告放在類中,而把定義放在類的外面。但對於類模板來說,這樣就出問題了。很多編譯器並不支援將友元函

【C++】C++的學習(三)——運算子過載函式

前言       前面的兩篇博文中介紹了類的一些基本特性,今天講一講運算子過載和友元。運算子過載      運算子過載是C++中一種形式的多型,運算子過載將過載的概念運用到運算子上,賦予運算子更多地含義。也許乍然一聽,似乎我們對它並不熟悉,其實它一直為我們使用,例如 * 運算

C++在模板中實現函式的方法

在類模板中過載了運算子,並把該函式宣告為友元函式.如果在類體外定義該友元函式(外部函式),則出現如下編譯錯誤: main.obj:errorLNK2019:無法解析的外部符號"class std::basic_ostream<char,struct std::char

C++模板函式)宣告的三種情況

根據《C++ Primer》第三版16.4節的敘述,C++類模板友元分為以下幾種情況1.非模板友元類或友元函式。 書上給了一個例子:class Foo{    void bar();};template <class T>class QueueItem{   

運算子過載函式作為成員函式函式的區別

運算子過載函式作為類成員函式與友元函式 最近在學習C++的基礎,簡單地記一些筆記。 關於運算子過載函式作為成員函式還是友元函式的注意點: 當運算子過載函式作為類的成員函式時,要求運算元左邊必須是一個物件,而函式的引數可以是同類的物件也可以是普通的變數

C++中模板使用模板函式

問題始於學習資料結構,自己編寫一個單鏈表,其中用到了過載輸出運算子<<,我寫的大約這樣: template <class T> class List { friend std::ostream& operator

名稱空間函式

定義流IO的友元函式很常見,但隨著專案變大,一般都將將類定義在某名稱空間內,這時,我們在該類中定義的友元函式和名稱空間是什麼關係?如果該友元函式在類的cpp檔案中實現,是放在名稱空間內還是放在名稱空間外?另外,對於該實現的函式,是否還需要給出函式宣告?也就是說,friend能否承擔宣告友元函式的責任

C++ 運算子過載函式的簡單運用例項

前言:C++的運算子過載與友元函式是像類似Java這種純的面向物件程式語言所不具備的特徵,那麼使用運算子過載與友元函式到底能帶來什麼樣的不同呢? 舉個例子,假如需要實現一個複數的加減法,用Java實現後兩個複數相加的程式碼可能如下: public sta

一個的成員函式宣告為另一個函式

友元提供了不同類的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制。通過友元,一個不同函式或另一個類中的成員函式可以訪問類中的私有成員和保護成員。c++中的友元為封裝隱藏這堵不透明的牆開了一個小孔,外界可以通過這個小孔窺視內部的祕密。 友元的正確使用能提高程式的執

1.B中成員函式是A的一個友元函式,主要就是函式定義和類宣告的順序問題 //TVFM.h #ifndef _TVFM_H_ #define _TVFM_H_ #include<iostream> /*B中成員函式是A的一個友元函式,主要就是函式定義和類宣告的順序問題*/ using

C++中模板過載

一個由《程式設計師面試寶典》引出的問題。 描述模板類的友元過載,用C++程式碼實現? 這實際上考察的是下面幾個問題: 1.模板類的編寫 2.模板類中友元函式的編寫 3.什麼時候會用到友元過載?答案是各種C++中的運算子。最典型的就是輸出操作符<<了。 書上給出的

為模版增添函式的幾種方法

《Effective C++ 3rd Edition》中的條款46提到了“需要型別轉換時請為模版定義非成員函式”,其中涉及到模版類和友元函式,我之前還從沒把這兩者聯絡在一起過。既然看到這裡,於是把相關的知識梳理了一下。為模版類新增的友元函式分為三類: 非模板友元 約束(b

過載運算子函式

本次部落格 主要學習運算子過載和友元函式。其中 運算子過載能夠將平時用於內建型別的變數的操作符(如+,-,*,/等)用於類物件; 友元這種C++機制使得非成員函式可以訪問私有資料。 一、過載運算子     過載運算子,

函式(轉)

《windows環境多執行緒程式設計原理與應用》中解釋: 如果將類的封裝比喻成一堵牆的話,那麼友元機制就像牆上了開了一個門,那些得 到允許的類或函式允許通過這個門訪問一般的類或者函式無法訪問的私有屬性和方法。友元機制使類的封裝性得到消弱,所以使用時一定要慎重。友元類的說明將外界的某個類在本類別的定義中說明為友

例項:函式

        學習了c++這麼久,一直沒有對友元進行了解,據說友元不是特別好用(據說,不是我說的),因此直到今天才去了解。其實友元確實不是很常用,但友元功能確實很實用,它不但能夠釋放類中的非公有成員,同時還能保證了類的封裝性。使用者可以有選擇為具體的類或函式賦予“通行證”