标签:
;函数模板友元 (即一个类友元的是一个全局函数模板而不是原先的全局函数,需注意类模板传入的类型)
标准带类模板参数 friend void fun1(A<T>& obj); 指定这个A<T>类型的模板有一个这样的朋友函数,那么也就意味着这个函数内部只能由A<T>类型的模板
实例化的类 实例化出来的对象可以访问这个对象的数据成员,不是这个类型的类模板就不能访问
;code
template<typename T>
class A{
public:
A(int n=0);
friend void fun1(A<T>& obj);
private:
int mData;
};
template<typename T>
A<T>::A(int n){
mData=n;
}
template<typename T>
void fun1(A<T>/*A<int>*/& obj){
//注意此处只有传<int>类型实例化的类模板,才能访问它的私有数据成员
cout<<obj.mData<<endl;
//自己实例化一个double类型的类模板就不能访问私有的数据成员了,因为友元没定义double
/*
A<double> a1;
cout<<a1.mData<<endl;
*/
}
int main(){
A<int> a1(10);
fun1(a1);
return 0;
}
;类模板友元(即一个类模板友元的是另外一个类模板,那么那个类模板就可以访问我的私有数据成员)
标准 friend class A<int>;
#include <iostream>
using namespace std;
//向前声明A模板
template<typename T> class A;
template<typename T>
class B{
public:
B(int n=0);
//类模板友元 即这个整个类模板都是我的朋友,全部可以访问我的私有成员
friend class A<B<int> >;
private:
int mData;
};
template<typename T>
B<T>::B(int n){
mData=n;
}
template<typename T>
class A{
public:
A(T& obj);
private:
int mData;
};
template<typename T>
A<T>::A(T& obj){
//访问类B的私有成员函数,因为友元了类模板所以不会报错private
mData=obj.mData;
}
int main(){
B<int> b1(10);
A<B<int> > a1(b1);
return 0;
}
;类模板成员函数友元(即只针对某个类模板的成员函数成为朋友可以访问我的私有数据成员,其他的成员函数都不可以访问)
标准 friend void A<int> fun1();
;code
#include <iostream>
using namespace std;
//向前声明A模板
template<typename T> class A;
template<typename T>
class A{
public:
A(T& obj);
void fun1(T& obj);
void fun2();
private:
int mData;
};
template<typename T>
A<T>::A(T& obj){
//访问类B的私有成员函数,因为友元了类模板所以不会报错private
mData=1;
}
template<typename T>
void A<T>::fun1(T& obj){
//这样写因为没有友元这个成员函数所以报错private member
//cout<<obj.mData<<endl;
//友元成员函数之后
//cout<<obj.mData<<endl;
}
template<typename T>
void A<T>::fun2(){
//友元成员函数之后 测试
B<T> b1(5);
cout<<b1.mData<<endl;
}
template<typename T>
class B{
public:
B(int n=0);
//类模板友元 即这个整个类模板都是我的朋友,全部可以访问我的私有成员
//friend class A<B<int> >;
//类模板成员函数友元
friend void A<T>::fun1(T& obj);
friend void A<T>::fun2();
private:
int mData;
};
template<typename T>
B<T>::B(int n){
mData=n;
}
int main(){
B<B<int> > b1(10);
A<B<B<int> > > a1(b1);
a1.fun1(b1);
a1.fun2();
return 0;
}
;模板非类型形参(只能传入常量,因为模板的展开如果是变量还要编译找变量的值,而模板实在预处理的时候完成的那时候还不操作.cpp文件呢所以,只能是常量)
解决问题,当很多函数只有参数值不一样的时候可以外部传入参数
模板类型形参
解决问题,当很多函数只有类型不一样的问题
模板重载只看参数个数,类型顺序统统不算重载
;code
//非类型形参int n也就是说可以传入一个常量到模板中,注意不能是变量
template<int n=5,typename T>
class A{
public:
A();
private:
int mData;
};
template<int n,typename T>
A<n,T>::A(){
mData=n;
}
int main(){
A<8,int> a1;
return 0;
}
函数模板友元
标签:
原文地址:http://www.cnblogs.com/jk0011/p/5561903.html