友元函数类外需要声明吗_C++的友元函数和友元类
时间: 2023-11-19 07:08:52 浏览: 77
在C++中,如果要将一个函数声明为某个类的友元函数,则需要在该类的声明中进行声明。但是,如果该友元函数定义在类外部,那么在类外部也需要进行一次声明,以便编译器能够正确地解析该函数。这种声明通常是在类的定义之外进行的,类似于普通的函数声明。示例代码如下:
```cpp
// 前置声明类
class MyClass;
// 友元函数声明
void myFriendFunction(MyClass& obj);
// MyClass 类的定义
class MyClass {
public:
// 构造函数
MyClass(int value) : m_value(value) {}
// 友元函数声明
friend void myFriendFunction(MyClass& obj);
private:
int m_value;
};
// 友元函数定义
void myFriendFunction(MyClass& obj) {
// 可以访问 MyClass 的私有成员
std::cout << "The value of MyClass is: " << obj.m_value << std::endl;
}
int main() {
MyClass obj(42);
// 调用友元函数
myFriendFunction(obj);
return 0;
}
```
如果要将一个类声明为另一个类的友元类,则需要在被声明的类的声明中进行声明。类似于友元函数,如果被声明的类定义在类外部,那么在类外部也需要进行一次声明。示例代码如下:
```cpp
// 前置声明类
class MyClass2;
// MyClass1 类的定义
class MyClass1 {
public:
// 构造函数
MyClass1(int value) : m_value(value) {}
// 友元类声明
friend class MyClass2;
private:
int m_value;
};
// MyClass2 类的定义
class MyClass2 {
public:
// 可以访问 MyClass1 的私有成员
void myFunction(MyClass1& obj) {
std::cout << "The value of MyClass1 is: " << obj.m_value << std::endl;
}
};
int main() {
MyClass1 obj1(42);
MyClass2 obj2;
// 调用 MyClass2 的成员函数
obj2.myFunction(obj1);
return 0;
}
```
需要注意的是,友元函数和友元类的使用应该尽量避免。因为它们破坏了封装性,导致代码可维护性降低。只有在确实有必要访问私有成员时才应该使用。
阅读全文