#include <iostream> class Circle { private: double radius; public: Circle(double r) : radius(r) {} // 声明友元函数 friend double calculateArea(Circle c); }; // 友元函数的实现 double calculateArea(Circle c) { return 3.14159 * c.radius * c.radius; } int main() { Circle circle(5); std::cout << "Area of circle: " << calculateArea(circle) << std::endl; return 0; }运行结果为:
Area of circle: 78.5397
在这个例子中,calculateArea() 函数虽然不是 Circle 类的成员,但第 11 行将它指定为 Circle 类的友元,所以它可以访问 Circle 类的私有成员 radius。#include <iostream> class Rectangle; class Square { private: int side; public: Square(int s) : side(s) {} // 声明友元类 friend class Rectangle; }; class Rectangle { private: int width, height; public: Rectangle(Square s) { width = s.side; // 可以访问 Square 类的私有成员 height = s.side; } int area() { return width * height; } }; int main() { Square square(4); Rectangle rectangle(square); std::cout << "Area of rectangle: " << rectangle.area() << std::endl; return 0; }运行结果为:
Area of rectangle: 16
在这个例子中,Rectangle 类是 Square 类的友元,那么 Rectangle 类中的所有成员函数都可以访问 Square 类的私有成员。friend int Rectangle::area();此时会发现,编译器提示 Rectangle 类的构造函数无法访问 Square 类的私有成员。
#include <iostream> // 前置声明 class A; // 定义 Manager 类 class Manager { public: void adjustID(A& a); }; // 定义 class A class A { private: int id; public: // 声明 Manager类中的 adjustID() 成员函数为友元函数 friend void Manager::adjustID(A& a); // 声明 << 运算符为友元函数 friend std::ostream& operator<<(std::ostream& out, const A& a); }; void Manager::adjustID(A& a) { static int index = 0; a.id = index; index++; } // 重载 << 运算符 std::ostream& operator<<(std::ostream& out, const A& a) { out << "ID : " << a.id << std::endl; return out; } int main() { A a1, a2, a3, a4; Manager mgr; mgr.adjustID(a1); mgr.adjustID(a2); mgr.adjustID(a3); mgr.adjustID(a4); std::cout << a1 << a2 << a3 << a4; return 0; }运行结果为:
ID : 0
ID : 1
ID : 2
ID : 3
本文链接:http://task.lmcjl.com/news/17235.html