成员函数和友元函数的不同之处
时间: 2024-06-15 20:07:31 浏览: 22
成员函数和友元函数是在面向对象编程中常用的两种函数类型,它们有以下不同之处:
1. 定义位置:成员函数是定义在类内部的函数,而友元函数是定义在类外部的函数。
2. 访问权限:成员函数可以直接访问类的私有成员和保护成员,而友元函数可以在类中声明为友元后,可以访问类的私有成员和保护成员。
3. 调用方式:成员函数通过对象来调用,而友元函数可以直接调用或通过对象调用。
4. 参数传递:成员函数的隐含参数是调用该函数的对象本身,而友元函数没有隐含参数。
5. 继承关系:成员函数可以被继承,子类可以重写父类的成员函数,而友元函数不能被继承。
相关问题
c++运算符重载成员函数和友元函数引用
C++运算符重载可以通过成员函数和友元函数两种方式实现。其中,成员函数重载运算符是将运算符重载为类的成员函数,而友元函数重载运算符是将运算符重载为非类的成员函数。
成员函数重载运算符的语法格式如下:
```cpp
返回类型 operator 运算符(参数列表) {
// 函数体
}
```
例如,将运算符“+”重载为my_string类的成员函数:
```cpp
class my_string {
public:
my_string operator+(const my_string& str) {
my_string result;
// 实现字符串拼接
return result;
}
};
```
而友元函数重载运算符的语法格式如下:
```cpp
friend 返回类型 operator 运算符(参数列表);```
例如,将运算符“+”重载为非my_string类的友元函数:
```cpp
class my_string {
public:
friend my_string operator+(const my_string& str1, const my_string& str2) {
my_string result;
// 实现字符串拼接
return result;
}
};
```
需要注意的是,成员函数重载运算符只能重载部分运算符,例如“+”、“-”、“*”、“/”等,而不能重载赋值运算符“=”和下标运算符“[]”;而友元函数重载运算符可以重载所有运算符。
重载为成员函数和友元函数的区别
重载为成员函数和友元函数的主要区别在于访问权限和参数传递方式。
成员函数重载是在类的内部定义的函数,可以访问类的私有成员,但只能通过类的对象或指针来调用,不能直接调用。参数传递方式是隐式传递this指针。
友元函数重载是在类外定义的函数,可以访问类的私有成员,但不能直接访问,需要通过类的对象或指针来访问。参数传递方式是显式传递对象或指针。
因此,成员函数重载更加方便和简洁,而友元函数重载更加灵活和可扩展。但在访问私有成员方面,二者没有区别。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)