100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元

时间:2024-02-18 20:25:59

相关推荐

C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元

1. 定义

如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例。如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例。

1.1 一对一友好关系

类模板与另一个(类或函数)模板间友好关系的最常见的形式是建立对应实例及其友元间的友好关系。

eg. Blob类应该将BlobPtr类和一个模板版本的Blob相

//前置声明,在Blob中声明友元所需要的template <typename> class BlobPtr;template <typename> class Blob; // 运算符==中的参数所需要的template <typename T> bool operator== (const Blob<T>&,const Blob<T>&) ;template <typename T> class Blob {//每个Blob实例将访问权限授予用相同类型实例化的BlobPtr和相friend class B1obPtr<T> ;friend bool operator==<T> (const Blob<T>&, const Blob<T>&) ;// 其他成员定义, 与12.1.1 (第405页)相同};

友元的声明用Blob的模板形参作为它们自己的模板实参。因此,友好关系被限定在用相同类型实例化的Blob与BlobPtr相等运算符之间

Blob<char> ca; // BlobPtr<char> 和operator==<char>都是本对象的友元Blob<int> ia;// BlobPtr<int>和operator==<int>都是本对象的友元

1.2 通用和特定的模板友好关系

一个类也可以将另一个模板的每个实例都声明为自己的友元,或者限定特定的实例为友元:

//前置声明,在将模板的一个特定实例声明为友元时要用到template <typename T> class Pal;class C {// C是一个普通的非模板类friend class Pal<C>; //用类C实例化的Pal是C的一个友元// Pal2的所有实例都是C的友元;这种情况无须前置声明template <typename T> friend class Pal2;};

template <typename T> class C2 {// C2 本身是一个类模板// C2的每个实例将相同实例化的Pal声明为友元friend class Pal<T>; // Pal 的模板声明必须在作用域之内// Pal2的所有实例都是C2的每个实例的友元,不需要前置声明template <typename X> friend class Pal2;// Pal3是一个非模板类,它是C2所有实例的友元friend class Pal3; //不需要Pal3的前置声明.};

1.3 令模板自己的类型参数成为友元

可以将模板类型参数声明为友元.

eg. 将用来实例化Bar的类型声明为友元。

对于某个类型名Foo:

Foo将成为Bar<Foo>的友元Sales_ data 将成为Bar<Sales data>的友元

template <typename Type> class Bar {friend Type; // 将访问权限授予用来实例化Bar的类型//...};

注意:虽然友元通常来说应该是一一个类或是一一个函数, 但我们完全可以用一个内置类型来实例化Bar.这种与内置类型的友好关系是允许的,以便我们能用内置类型来实例化Bar这样的类。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。