C++ 在类中重载操作符 和 声明全局函数重载操作符 有什么区别?
时间: 2023-05-28 09:06:32 浏览: 78
在类中重载操作符和声明全局函数重载操作符的区别在于作用域和参数。在类中重载操作符时,操作符函数是类的成员函数,可以访问类中的私有成员变量和方法,而且操作符函数的第一个参数是隐式的this指针,代表调用对象,其他参数是显式传递的。而声明全局函数重载操作符时,操作符函数是全局函数,不能访问类中的私有成员变量和方法,而且操作符函数的所有参数都是显式传递的。因此,如果需要访问类中的私有成员变量和方法,应该在类中重载操作符;如果不需要访问类中的私有成员变量和方法,或者需要与其他类或函数一起使用,可以声明全局函数重载操作符。
相关问题
类的操作符重载分别在头文件和源文件中怎么写?
在 C++ 中,类的操作符重载通常也分为头文件和源文件两部分。
在头文件中,我们通常只需要声明该操作符的原型,而在源文件中则需要实现该操作符的具体功能。
以重载运算符 `+` 为例,操作符重载的头文件和源文件的写法如下:
在头文件中,声明该操作符的原型:
```c++
// MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass {
public:
MyClass operator+ (const MyClass& other) const;
private:
int value;
};
#endif
```
在源文件中,实现该操作符的具体功能:
```c++
// MyClass.cpp
#include "MyClass.h"
MyClass MyClass::operator+ (const MyClass& other) const {
MyClass result;
result.value = this->value + other.value;
return result;
}
```
需要注意的是,如果该操作符重载函数是类的成员函数,我们需要在函数名前面加上 `operator` 关键字,并在函数实现时使用 `::` 运算符指定该函数属于哪个类。
而如果该操作符重载函数是类的非成员函数,则需要在函数名前面加上 `friend` 关键字,并在函数实现时不需要指定该函数属于哪个类。
例如,重载运算符 `<<` 时,我们通常会将其定义为一个非成员函数,并声明为该类的友元函数,如下所示:
```c++
// MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <iostream>
class MyClass {
public:
friend std::ostream& operator<< (std::ostream& os, const MyClass& obj);
private:
int value;
};
#endif
```
```c++
// MyClass.cpp
#include "MyClass.h"
std::ostream& operator<< (std::ostream& os, const MyClass& obj) {
os << obj.value;
return os;
}
```
讲解一下C++自定义类重载操作符
在C++中,可以通过重载运算符来实现自定义类的行为。C语言中也可以使用这种方法,但需要借助函数指针。在C语言中,运算符被定义为函数,可以使用函数指针来实现运算符重载。
以重载"+"运算符为例,假设我们有一个自定义的复数类Complex,可以定义一个名为Complex_add的函数,用于实现复数相加的运算:
```
typedef struct {
double real;
double imag;
} Complex;
Complex Complex_add(Complex a, Complex b) {
Complex c;
c.real = a.real + b.real;
c.imag = a.imag + b.imag;
return c;
}
```
然后,我们可以定义一个名为operator+的函数,用于重载"+"运算符:
```
Complex operator+(Complex a, Complex b) {
return Complex_add(a, b);
}
```
这里的operator+函数返回一个Complex类型的值,实现了"+"运算符的功能。我们可以通过以下方式使用此运算符:
```
Complex a = {1.0, 2.0};
Complex b = {3.0, 4.0};
Complex c = a + b;
```
这样,c的值将为{4.0, 6.0},即a和b的复数相加的结果。
同样的方法,也可以重载其他运算符,例如"-"、"*"、"/"等等。需要注意的是,不是所有运算符都可以重载,例如"."和"sizeof"等运算符无法重载。