C++友元
来源:互联网 发布:毕厶迦男装淘宝店 编辑:程序博客网 时间:2024/05/22 17:22
对友元函数的概念总是模糊不清,每次复习基础都觉得已经懂了,结果用的时候又不知道怎么用了。
比如说在类内定义了一个友元函数,我就总是会想到:这个函数是哪个类的成员函数,如何确定两个累是“朋友”?
这种想法困扰了我很长时间,其实还是概念不清,其实,友元的本意是让其他的非类成员也能访问该类的成员。友元函数百科
#include <cstdlib>#include <iostream>#include <string>#include <ostream>using namespace std;class A{ public: int a; A(){ } void say(){ cout<<"lala"; } friend ostream& operator<<(ostream& out,const A& m) { out<<m.a; return out; }};int main(int argc, char *argv[]){/* int i=0,j=1,k=2; int *ptr[3]; ptr[0]=&i; ptr[1]=&j; ptr[2]=&k; for(int m=0;m<3;m++) cout<<*ptr[m]<<endl; system("PAUSE"); return EXIT_SUCCESS; */ A *p=new A[10]; for(int i=0;i<10;i++) p[i].a=i; for(int i=0;i<10;i++) cout<<p[i]; system("PAUSE"); return EXIT_SUCCESS;}
自己写了一个<<重载函数,初始版本是没有写friend关键字的,结果编译器总是报错:
std::ostream& A::operator<<(std::ostream&, const A&)' must take exactly one argument
意思是该函数只能有一个参数
其实真正的原因是:
重载操作符必须符合内建的模型,也就是说,重载操作符后的行为要与原来一致。
<< 操作符是一个二元操作符,它只接受二个参数,调用时的形式为:第一个参数<<第二个参数,如:
ostream& operator<< (ostream& os, const Point& pt);
的调用形式为: os<<pt (返回引用是为了可以连写:os << pt1 << pt2; )
而如果要将<<操作符定义为类的成员函数,那么你就只能给一个参数(因为编译器展开类成员函数时将*this对象作为第一个参数),如果你给两个参数,那最后<<操作就变成三元的了,与原模型不符,所以编译器给出“overload.cpp:17: error: ‘std::ostream& Point::operator<<(std::ostream&, const Point&)’ must take exactly one argument”的错误。
如果你偏要定义成成员函数,并正确的只给出一个参数ostream&,那么最后的调用式就只能写成:
pt << std::cout;
那么你是不是觉得“违反了标准”呢(虽然程序可正确运行)?而且如果返回ostream&,就无法连写了!
- C++(一)友元
- [C++]友元学习
- [c++]友元函数
- [c++] 友元详解
- 【C++】友元函数
- c++:友元函数
- C++:友元函数
- C++:友元
- C/C++ 友元
- 【C++】友元函数
- C++:友元
- C++----友元
- 【C++】C++友元
- C++_友元函数
- C++_友元函数
- C++_友元函数
- C++_友元函数
- C++_友元函数
- 各种字节编码的介绍
- HTML+css+div
- poj 3009 dfs
- ios sqlite入门总结
- Please ensure that adb is correctly located at 最新详细方案
- C++友元
- 01背包 (大数据)
- 淘宝千牛软件服务器fmsas端口与客户端的通信协议(完整版)
- 【端午小练】HDU1804-Deli Deli
- IE中调用客户端中的程序
- Counting Triangles - HUD 1396 递推
- Tolua++技术文档 【转】
- POJ 1852 Ants
- jqgrid 分页javar端使用