声明类的 成员函数为友元
时间: 2024-03-24 21:35:53 浏览: 17
在C++中,可以将一个类的成员函数声明为另一个类的友元函数。这样,该类的成员函数就可以访问另一个类的私有成员。
例如,假设有两个类A和B,A类中有一个私有成员变量x,B类中有一个成员函数foo(),如果我们希望foo()可以访问A类中的x,可以在A类中将foo()声明为友元函数,如下所示:
```c++
class A {
private:
int x;
friend void B::foo(); // 将B类的成员函数foo()声明为A类的友元函数
};
class B {
public:
void foo() {
A a;
a.x = 10; // 在B类的foo()函数中可以访问A类的私有成员变量x
}
};
```
需要注意的是,声明类的成员函数为友元函数时,需要在另一个类的定义之前进行声明。
相关问题
成员函数作为友元与普通函数作为友元,两者之间有什么不同。
成员函数作为友元与普通函数作为友元之间的最大不同在于它们访问的权限不同。
成员函数作为友元函数时,它们可以访问该类的所有私有成员和保护成员,包括被继承的私有成员和保护成员。这种情况下,友元函数和类的成员函数没有本质区别,它们都可以调用类的私有成员和保护成员。
而普通函数作为友元函数时,它们只能访问该类中被声明为 `public` 和 `protected` 的成员,无法访问该类的私有成员,因为友元函数不是该类的成员函数。
因此,在选择成员函数作为友元函数或普通函数作为友元函数时,需要根据需要访问的成员来确定。如果需要访问该类的私有成员,就需要选择成员函数作为友元函数;如果只需要访问该类的公共成员和保护成员,可以选择普通函数作为友元函数。
将calculate类中的成员函数声明为circle类的友元函数
您可以在calculate类中声明circle类的友元函数的语法如下:
```c++
class circle; // 先声明一下circle类,以便后面的函数可以引用
class calculate {
public:
friend double circle_area(const circle& c); // 声明circle_area函数为circle类的友元函数
};
class circle {
private:
double radius;
public:
circle(double r) : radius(r) {}
double area() const {
return circle_area(*this); // 调用calculate类的友元函数
}
};
// 定义circle_area函数
double circle_area(const circle& c) {
return 3.14 * c.radius * c.radius;
}
```
在这个例子中,calculate类声明了一个名为circle_area的函数,这个函数以一个circle对象为参数,并且被声明为circle类的友元函数。在circle类的area函数中,它调用了circle_area函数来计算圆的面积,而circle_area函数可以访问circle类的private成员变量radius。