C++_模板类的友元运算符重载_原理
2015-08-06 10:44
399 查看
方法一
#include<iostream> using namespace std; template <class T> class Test { private: T num; public: Test( T n) { num=n; } friend ostream& operator<< <>(ostream &out,const Test<T> &); }; template <class T> ostream& operator<< <>(ostream &out,const Test<T> &obj) { out<<obj.num; return out; }; void main() { Test<int> t(414); cout<<t; }
方法二
// 第二种格式 #include <iostream> using namespace std; template<class T> class Test { public: template<class S> // 注意<class S>S friend ostream& operator << (ostream& out, const Test<S>& obj); Test(T n = 0) :num(n) {} Test(const Test<T>& copy) { num = copy.num; } private: T num; }; // 注意<class T>和<class S>都行 template<class T> ostream& operator << (ostream& out, const Test<T>& obj) { out << obj.num << endl; return out; } int main(){ Test<int> t(2); cout << t; return 0; }
正确的写法就是代码段中的写法。<>也必不可少,其实<>有两
重意思:
一是,表明此友元函数是函数模板;
二是,此模板使用的模板类型参数为当前
模板类的类型参数class。
关于friend关键字:
· 虚函数必须是成员函数。如果f必须是虚函数,就让它成为c的成员函数。
operator>>;和operator<<;决不能是成员函数。如果f是operator>>;或operator<<;,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。
·只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。
·其它情况下都声明为成员函数。如果以上情况都不是,让f成为c的成员函数。
然后在类体外对友元函数进行定义,定义的格式和普通函数相同,但可以通过对象作为参数直接访问对象的私有成员。
1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分;
2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号;
3)友元函数不能直接访问类的成员,只能访问对象成员,
4)友元函数可以访问对象的私有成员,但普通函数不行;
5)调用友元函数时,在实际参数中需要指出要访问的对象,
6)类与类之间的友元关系不能继承。
相关文章推荐
- C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
- 黑马程序员---C语言基础---结构体、枚举、typedef、宏、static和extern
- 图像显示
- VC++2010 MFC程序怎么在其他电脑运行
- 队列(C语言)
- 链表(C语言)
- 《手把手教你学51单片机-C语言》之十一--------UART串口通信
- 顺序表(C语言)
- JAVA基础篇三(Java,C++中的异常机制)
- 64位的Ubuntu系统上使用汇编nasm和C语言
- C++中重载、覆盖、隐藏之间的关系
- C++11 标准新特性: 右值引用与转移语义
- 指针与引用的区别
- (C/C++学习笔记)指针做函数参数形成回调
- C++ vector容器类型及初始化方法
- c++中的map用法详解
- C语言字符串处理函数
- Berland National Library
- python pip install tables couldn't find microsoft vc++ 9.0 (vcvarsall.bat)
- C++字符串排序