### C运算符重载知识点详解
#### 一、运算符重载概述
运算符重载是一种特殊的函数形式,它允许用户重新定义特定类的对象如何使用内置运算符。这对于提高代码的可读性和灵活性非常有帮助。
#### 二、C运算符重载基本概念
在C语言中,并不支持运算符重载,但C++引入了这一特性。这里提到的“C运算符重载”可能是指使用C++风格进行讲解。以下内容基于这一假设进行展开。
#### 三、单目运算符重载
单目运算符通常只有一个操作数。例如,负号 `-` 和增减运算符 `++` 和 `--`。
##### 1. 负号“-”
**成员函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
C operator-() {
C temp;
temp.x = -x;
return temp;
}
};
```
**友元函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
friend C operator-(const C&);
};
C operator-(const C& m) {
C temp;
temp.x = -m.x;
return temp;
}
```
**区别:**
- 成员函数重载时无需参数,因为当前对象就是操作数。
- 友元函数重载时需要一个参数来表示操作数。
##### 2. 前置运算符++
**成员函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
C operator++() {
x++;
return *this;
}
};
```
**友元函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
friend C operator++(C&);
};
C operator++(C& t) {
t.x++;
return t;
}
```
##### 3. 后置运算符--
**成员函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
C operator--(int) {
x--;
return *this;
}
};
```
**友元函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
friend C operator--(C&, int);
};
C operator--(C& t, int) {
t.x--;
return t;
}
```
**注意事项:**
- 整型参数没有实际意义,仅用于区分前置和后置运算符。
#### 四、双目运算符重载
双目运算符涉及两个操作数,如加法 `+` 和乘法 `*`。
##### 1. 加号+
**成员函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
C operator+(const C& m) {
C temp;
temp.x = x + m.x;
return temp;
}
};
```
**友元函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
friend C operator+(const C&, const C&);
};
C operator+(const C& m1, const C& m2) {
C temp;
temp.x = m1.x + m2.x;
return temp;
}
```
##### 2. 乘号*
**成员函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
C operator*(const C& m) {
C temp;
temp.x = x * m.x;
return temp;
}
};
```
**友元函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
friend C operator*(const C&, const C&);
};
C operator*(const C& m1, const C& m2) {
C temp;
temp.x = m1.x * m2.x;
return temp;
}
```
##### 3. 复合赋值运算符+=
**成员函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
C& operator+=(const C& m) {
x += m.x;
return *this;
}
};
```
**友元函数重载:**
```cpp
class C {
private:
double x;
public:
// ... 构造函数等
friend C& operator+=(C&, const C&);
};
C& operator+=(C& lhs, const C& rhs) {
lhs.x += rhs.x;
return lhs;
}
```
#### 五、示例分析
考虑下面的例子:
```cpp
class C {
private:
double x;
public:
C() : x(0.0) {}
C(double a) : x(a) {}
friend C operator--(C t);
void show() { std::cout << x << std::endl; }
};
C operator--(C t) {
t.x--;
return t;
}
void main() {
C c(5.6);
(--c).show(); // 输出4.6
c.show(); // 输出5.6
}
```
在这个例子中,我们首先定义了一个简单的类 `C` 并重载了后置递减运算符。通过 `(--)` 操作,我们可以看到类对象 `c` 的值被改变了两次,第一次输出 `4.6` 是因为 `(--)` 先将 `c` 的值减一然后返回修改后的值;第二次输出 `5.6` 表明 `c` 的值在上一步操作后已经变成了 `5.6`。
以上内容覆盖了C运算符重载的基本概念及其具体实现方法。理解这些内容可以帮助开发者更好地使用运算符重载功能,提高代码质量和可维护性。