C++ 友元
时间: 2023-07-03 12:09:56 浏览: 61
在 C++ 中,友元(friend)是一种机制,它允许一个类或函数访问另一个类的私有成员。具体来说,如果一个类或函数被声明为另一个类的友元,那么它就可以访问该类的私有成员,即使这些成员在类定义中被声明为 private。
友元可以是一个函数,也可以是一个类。当一个类被声明为另一个类的友元时,该类的所有成员函数都可以访问目标类的私有成员。
友元的声明通常放在目标类的定义中,例如:
```c++
class A {
private:
int x;
friend void B::foo(A& a); // 声明 B::foo 是 A 的友元函数
};
class B {
public:
void foo(A& a) {
a.x = 10; // B::foo 可以访问 A 的私有成员 x
}
};
```
在上面的例子中,类 A 声明了类 B 的成员函数 foo 是它的友元函数。这意味着 B::foo 可以访问 A 的私有成员 x,即使 x 在 A 中被声明为 private。
相关问题
c++友元
C++中的友元(friend)是一种机制,允许一个类的非成员函数或另一个类访问该类的私有成员。
友元可以在类的定义中声明,也可以在类的外部声明。在类的定义中声明的友元函数或友元类只对当前类可见,而在类的外部声明的友元函数或友元类对该类的所有实例都可见。
例如,假设我们有一个类A和一个函数B,函数B需要访问类A的私有成员变量。我们可以将函数B声明为类A的友元函数,以便让函数B访问类A的私有成员变量。
以下是一个示例:
```c++
class A {
private:
int x;
public:
friend void B(A& a); // 友元函数B
};
void B(A& a) {
a.x = 10; // 可以访问A的私有成员变量x
}
```
在这个例子中,我们定义了一个类A,它有一个私有成员变量x。然后我们声明了一个函数B,将其声明为类A的友元函数。在函数B中,我们可以访问类A的私有成员变量x。
友元不应该被滥用,因为它破坏了封装性和数据隐藏的原则。只有在必要的情况下才应该使用友元。
c++友元重载
可以重载一个友元函数,但必须保证每个重载的函数都被声明为友元。
以下是一个例子:
```c++
class MyClass {
private:
int x;
public:
MyClass(int a): x(a) {}
friend void print(MyClass obj);
friend void print(int a, MyClass obj);
};
void print(MyClass obj) {
cout << obj.x << endl;
}
void print(int a, MyClass obj) {
cout << a << " " << obj.x << endl;
}
int main() {
MyClass obj(5);
print(obj); // 调用第一个友元函数
print(10, obj); // 调用第二个友元函数
return 0;
}
```
在上面的例子中,MyClass类声明了两个友元函数`print()`和`print(int, MyClass)`。这两个函数都可以访问MyClass的私有成员x。在主函数中,我们分别调用了这两个友元函数。注意,这两个友元函数的声明必须在类定义中。