c++友元函数和友元类_友元函数在类中的定义位置是

c++友元函数和友元类_友元函数在类中的定义位置是目录​​​​​​​友元函数:友元函数说明:操作多个对象数据成员的友元函数:1:将函数声明为相关类的友元函数:2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数友元类:友元分为:友元函数

目录​​​​​​​

友元函数:

友元函数说明:

操作多个对象数据成员的友元函数:

1:将函数声明为相关类的友元函数:

2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数

友元类:


友元分为:友元函数和友元类

友元函数

1:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

友元函数的优点是:提高编程的灵活性和线程执行的效率。缺点是:破坏了类的封装机制

 

反例:

c++友元函数和友元类_友元函数在类中的定义位置是

示范代码:

#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; }

正确结果:

c++友元函数和友元类_友元函数在类中的定义位置是

友元函数说明:

  • 友元函数可以访问类的私有成员,但不是类的成员函数,所以也没有隐含的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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注