首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 類模板友元六大形式完整解析

     編輯:關於C++

類模板友元的複雜性

類模板因包含模板參數,導致友元宣告出現多種匹配形式,遠比一般類別複雜。主要分為六大類型:

六種友元形式

  1. 類-友元(特定實例化):friend class Pal<C>; — 僅 Pal<C> 為友元
  2. 類-友元(所有實例化):template <typename T> friend class Pal2; — Pal2 所有實例化皆為友元
  3. 模板類-友元(相同參數):friend class Pal<T>; — 與外層類別相同模板參數
  4. 模板類-友元(任意參數):template <typename X> friend class Pal2; — 參數名稱不可與外層相同
  5. 模板類-友元(一般類別):friend class Pal3; — 非模板類別為友元
  6. 模板類-友元(模板參數本身):friend T; — C++11 新增,模板型別參數直接為友元

完整程式碼展示

/* 
 * cppprimer.cpp - 類模板友元六種形式
 * Created on: 2013.11.24
 * Author: Caroline 
 * eclipse cdt, gcc 4.8.1
 */
#include <iostream>
#include <string>

template <typename T> class Pal;
template <typename T> class Pal2;
class Pal3;
class Pal4;

// 一般類別的友元宣告
class C {
    friend class Pal<C>;              // 形式1
    template <typename T> friend class Pal2; // 形式2
private:
    void print() { std::cout << "class C" << std::endl; }
};

// 類模板的友元宣告
template <typename T>
class C2 {
    friend class Pal<T>;              // 形式3
    template <typename X> friend class Pal2; // 形式4
    friend class Pal3;                // 形式5
    friend T;                         // 形式6 (C++11)
private:
    void print() { std::cout << "class C2" << std::endl; }
};

// 各種友元類別實作
template <typename T> class Pal { ... };
template <typename T> class Pal2 { ... };
class Pal3 { ... };
class Pal4 { C2<Pal4> myC2; ... }; // 形式6 實際應用

執行結果分析

Hello Mystra!
this is class Pal : class C
this is class Pal2 : class C
this is class Pal : class C2
this is class Pal2 : class C2
this is class Pal3 : class C2
this is class Pal4 : class C2

關鍵觀察:Pal2<int> 內部的 C2<double> 仍可存取私有成員,證明友元關係不受模板參數實際型別限制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved