成员函数和友元函数的不同之处
时间: 2024-06-15 14:07:31 浏览: 176
成员函数和友元函数是在面向对象编程中常用的两种函数类型,它们有以下不同之处:
1. 定义位置:成员函数是定义在类内部的函数,而友元函数是定义在类外部的函数。
2. 访问权限:成员函数可以直接访问类的私有成员和保护成员,而友元函数可以在类中声明为友元后,可以访问类的私有成员和保护成员。
3. 调用方式:成员函数通过对象来调用,而友元函数可以直接调用或通过对象调用。
4. 参数传递:成员函数的隐含参数是调用该函数的对象本身,而友元函数没有隐含参数。
5. 继承关系:成员函数可以被继承,子类可以重写父类的成员函数,而友元函数不能被继承。
相关问题
成员函数和友元函数的区别
成员函数和友元函数都是C++中访问类私有数据的机制,但它们之间有一些关键区别:
1. **作用范围**:
- **成员函数**(Member Function):这是类自身的一部分,可以直接访问类的私有和保护成员变量。它们通常用于操作类的状态。只有声明为公有的成员函数才能从类的外部访问。
- **友元函数**(Friend Function):并非类的组成部分,而是外部定义的一个函数,它被直接指定为某个类的友元。友元函数可以访问该类的所有私有和保护成员。
2. **声明位置**:
- **成员函数**:必须在类内部声明,可以在类体内的任何地方,包括构造函数和析构函数内。
- **友元函数**:既可以放在类体外,也可以在类体内的其他部分声明,但通常是在类外面定义。
3. **所有权**:
- **成员函数**:属于类的一部分,由类控制其访问权限。
- **友元函数**:不属于类,不是类的组成部分,所以友元函数不能继承,也不能作为虚函数。
4. **生命周期**:
- **成员函数**:随着类的创建和销毁而存在。
- **友元函数**:独立于类,不会因为类的销毁而消失。
5. **访问权限**:
- **成员函数**:通常按照封装原则,控制对私有成员的访问。
- **友元函数**:不受此限制,能访问类的所有私有和受保护成员。
6. **模板应用**:
- **成员函数**:可以像普通函数一样接受模板参数。
- **友元函数**:同样可以接收模板参数,但友元函数的模板实例化需要显式指定。
总结来说,成员函数是类的内置工具,用于操作类的对象,而友元函数则是为了某些特殊场景(如实现特定的日志功能),突破了正常封装规则的访问方式。
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;
}
};
```
需要注意的是,成员函数重载运算符只能重载部分运算符,例如“+”、“-”、“*”、“/”等,而不能重载赋值运算符“=”和下标运算符“[]”;而友元函数重载运算符可以重载所有运算符。
阅读全文