目录
2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数
友元分为:友元函数和友元类
友元函数:
1:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
友元函数的优点是:提高编程的灵活性和线程执行的效率。缺点是:破坏了类的封装机制
反例:
示范代码:
#include<iostream> using namespace std; class Date { friend void PrintfDate(const Date& d); public: Date(int year, int month, int day) :_year(year) , _month(month) , _day(day) {} private: int _year; int _month; int _day; }; void PrintfDate(const Date& d) { cout << d._year << "-" << d._month << "-" << d._day << endl; } int main() { Date d(2018,9,10); PrintfDate(d); return 0; }
正确结果:
友元函数说明:
- 友元函数可以访问类的私有成员,但不是类的成员函数,所以也没有隐含的this指针
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类的访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元函数和普通函数的调用原理相同(传值),不需要通过对象来调用
操作多个对象数据成员的友元函数:
1:将函数声明为相关类的友元函数:
如果一个函数需要操作多个不同类对象的非公有成员,有以下两种方式:
class B;//向前引用声明 class A { friend int fun(A & ,B &);//声明为A类友元函数 //... }; class B { friend int fun(A &,B &); // 声明为B类友元函数 //... }; int fun(A& a, B& b)//fun()函数实现 {};
这样可以通过fun()函数直接可以访问A,B类对象的非公有成员
由于函数fun()的形参为A类的对象和B类的对象,所以需要使用向前引用声明,因为c++在调用资源时应确保调用前进行过声明或定义,否则调用无效,程序出错
2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数
class A;//向前引用声明 class B { int fun(A & ,B &);//声明fun为B类的成员元函数 //... }; class A { friend int B::fun(A &,B &); // 声明B::fun为A类友元函数 //... }; int B::fun(A& a, B& b)//fun()函数实现 {};
友元类:
友元类的所有成员函数的都可以是另一个类的友元函数,,都可以访问另一个类的非公有成员。
class A //A类 { //...//B类成员声明 public: friend class B;//声明类A的友元类B //... }; //A,B类的实现
- 友元关系不能被继承
- 友元关系是单向的,不具有交换性
- 友元关系不能传递
#include<iostream> using namespace std; class A //A类 { int n; public: A() { n = 5; }; friend class B;//声明类A的友元类B }; class B { public: void printf(A tmp) { cout << tmp.n << endl; }; }; void main() { A a; B b; b.printf(a); }
今天的文章
c++友元函数和友元类_友元函数在类中的定义位置是分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89797.html