重载为成员函数和友元函数的区别
时间: 2023-08-30 08:06:09 浏览: 49
重载为成员函数和友元函数的主要区别在于访问权限和参数传递方式。
成员函数重载是在类的内部定义的函数,可以访问类的私有成员,但只能通过类的对象或指针来调用,不能直接调用。参数传递方式是隐式传递this指针。
友元函数重载是在类外定义的函数,可以访问类的私有成员,但不能直接访问,需要通过类的对象或指针来访问。参数传递方式是显式传递对象或指针。
因此,成员函数重载更加方便和简洁,而友元函数重载更加灵活和可扩展。但在访问私有成员方面,二者没有区别。
相关问题
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指针,它指向调用该成员函数的对象。因此,在成员函数重载运算符中,我们只需要传递一个参数即可。
友元函数重载运算符没有隐含的this指针,因此,它需要显式地传递所有的参数。在友元函数中,我们通常需要传递两个参数,第一个参数是一个对象,第二个参数是另一个对象或者其他需要的参数。
例如,我们可以使用如下代码重载加法运算符:
```
class Complex {
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
Complex operator+(const Complex& other) const;
private:
double real, imag;
};
Complex Complex::operator+(const Complex& other) const {
return Complex(real + other.real, imag + other.imag);
}
Complex operator+(const Complex& c1, const Complex& c2) {
return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
```
在上面的例子中,我们可以看到,成员函数重载了加法运算符,而友元函数也重载了加法运算符。在成员函数中,我们只需要传递一个参数(other),而在友元函数中,我们需要传递两个参数(c1和c2)。
综上所述,在重载运算符时,成员函数和友元函数在传参方面也有所不同,开发者需要根据具体的情况选择适合的方式。