友元函数的位置在类体内和在类体外的不同
时间: 2024-03-24 17:36:56 浏览: 26
友元函数是一个不属于任何类的普通函数,但是它可以访问该类的私有成员和保护成员。在 C++ 中,友元函数可以在类体内和类体外进行声明和定义,它们的区别如下:
1. 在类体内声明,在类体外定义
在类体内声明友元函数,但是在类体外定义它。这种方式可以让友元函数的声明与类的定义放在一起,方便查看,同时也可以把友元函数的定义放在单独的文件中。
```cpp
class MyClass {
public:
void func();
friend void friendFunc();
};
void friendFunc() {
// 可以访问 MyClass 的私有成员和保护成员
}
void MyClass::func() {
friendFunc();
}
```
2. 在类体外声明和定义
在类体外声明和定义友元函数。这种方式可以让友元函数的声明和定义分开,有利于代码的模块化设计。
```cpp
class MyClass {
public:
void func();
friend void friendFunc();
};
void friendFunc() {
// 可以访问 MyClass 的私有成员和保护成员
}
void MyClass::func() {
friendFunc();
}
```
无论是在类体内还是在类体外声明和定义友元函数,都要在友元函数的声明前加上 `friend` 关键字,这样才能使这个函数成为该类的友元函数,并且能够访问该类的私有成员和保护成员。
相关问题
friend 友元类和友元函数 friend 友元类和友元函数
友元类是指在一个类中,可以通过友元关键字将另一个类声明为友元类。友元类的所有成员函数都能够访问被声明为友元类的类的私有和保护成员。这意味着友元类能够绕过类的访问限定符,直接访问私有和保护成员变量和函数。
友元函数是指在一个类中,可以通过友元关键字将一个函数声明为友元函数。这个友元函数可以访问该类的私有和保护成员,但不是类的成员函数。与友元类类似,友元函数也能够绕过类的访问限定符,直接访问私有和保护成员。
友元函数和友元类的使用方式都是通过在类中使用friend关键字进行声明。友元函数可以在类的任何地方进行声明,并且一个函数可以是多个类的友元函数。另外,友元函数不能用const修饰。
友元函数应该写在类中的哪个位置
友元函数在类中的声明通常写在类内部,但是定义则写在类外部。友元函数的声明需要在函数名前加上`friend`关键字,并且需要在函数名前加上类名或类的别名。例如:
```c++
class MyClass {
public:
MyClass(int x) : x_(x) {}
// 友元函数的声明
friend void printX(const MyClass& obj);
private:
int x_;
};
// 友元函数的定义
void printX(const MyClass& obj) {
std::cout << obj.x_ << std::endl;
}
```
在上面的例子中,`printX()`函数是`MyClass`类的友元函数,它可以访问`MyClass`类的私有成员`x_`。需要注意的是,友元函数虽然可以访问类的私有成员,但是它本身并不属于类的成员函数。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)