C++第三次作业:友元类
友元类
将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计成一个类外的普通函数还是一个成员函数都不是那么让人满意,那么该怎么处理这个问题呢?友元类的机制给我们提供了一种思路。
友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
一旦将A类设置为了B的友元类,那么A的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
用法:通过<<friend>>构造性来实现。
下面是代码实例:
#include "pch.h" #include <iostream> using namespace std; class Dog { public: Dog(int newweight, int newage); void Show(); friend class B; //友元类 private: int weight; int age; }; Dog::Dog(int newweight, int newage) { weight = newweight; age = newage; } void Dog::Show() { cout << "汪汪"<<endl; } class B { public: void print(Dog &a) { cout << "weight=" << a.weight << " age=" << a.age <<endl; } private: int number=3; };
int main() //主函数测试 { Dog Tom(20,6); B Jack; Jack.print(Tom); }
测试结果如下:
测试结果表明Dog的友元B是可以去访问Dog的数据的,这样,就实现了数据的共享。
上面代码实现的是B访问Dog的数据,既然存在友元关系,那么,Dog能访问到B中的数据吗?我们修改代码如下图。
#include "pch.h" #include <iostream> using namespace std; class Dog { public: void Show(B &a); friend class B; private: int weight; int age; }; void Dog::Show(B &a) //对B类中的数据进行访问 { cout << a.number<<endl; } class B { public: private: int number=3; }; int main() { Dog Tom; B Jack; Tom.Show(B); }
如果能进行访问,那么打印的结果应该为“3”,但是编译器显示错误,无法运行,那么说明,当B是Dog的友元是,Dog无法访问到B中的数据,仅B可以访问Dog的数据。
通过实践以及对书的理解,我们最终可以得出:
1.友元关系是不能传递的。
2.友元关系是单向的
3.友元关系是不能被继承的。