C++数据结构与运算符重载知识详解
立即解锁
发布时间: 2025-08-19 01:36:31 阅读量: 2 订阅数: 6 


C++面向对象编程入门与实践
### C++ 数据结构与运算符重载知识详解
#### 1. 队列与栈的数据存储差异
队列和栈都使用数组来存储数据,但二者存在明显区别。栈使用一个名为 `top` 的整数变量来跟踪栈顶位置;而队列则需要两个变量,`head` 指向队列头部,`tail` 指向队列尾部。元素从队列尾部加入(就像银行里最后一位排队的顾客),从队列头部移除。随着元素的加入和移除,`tail` 会沿着数组跟随 `head` 移动。当 `tail` 或 `head` 到达数组末尾时,需要将其绕回到数组开头,例如使用如下语句:
```cpp
if(tail == MAX-1)
tail = -1;
```
这种数组也被称为循环缓冲区,因为 `head` 和 `tail` 会围绕数组循环,数据存储在它们之间。
#### 2. 矩阵类的创建
矩阵是二维数组。我们可以创建一个 `matrix` 类,它具备与特定数组类相同的安全特性,即检查数组索引是否越界。`matrix` 类的成员数据是一个 10x10 的数组,其构造函数允许程序员指定矩阵的实际维度(需小于 10x10)。访问矩阵数据的成员函数需要两个索引,分别对应数组的两个维度。以下是一个操作该类的 `main()` 函数片段示例:
```cpp
matrix m1(3, 4); // 定义一个矩阵对象
int temp = 12345; // 定义一个整数值
m1.putel(7, 4, temp); // 将 temp 的值插入矩阵的 7,4 位置
temp = m1.getel(7, 4); // 从矩阵的 7,4 位置获取值
```
#### 3. 长双精度浮点数转换为货币字符串
我们可以编写一个 `ldtoms()` 函数,将 `long double` 类型的数字转换为货币字符串。具体步骤如下:
1. 检查原始 `long double` 值是否过大,建议不转换大于 9,999,999,999,999,990.00 的数字。
2. 使用 `ostrstream` 对象将 `long double` 转换为纯字符串(无美元符号和逗号),存储在 `ustring` 缓冲区中。
3. 创建一个以美元符号开头的新字符串,从左到右逐个复制 `ustring` 中的数字,并每三位插入一个逗号。
4. 去除前导零。
5. 用 `'\0'` 字符终止字符串。
以下是一个使用该函数的 `main()` 程序示例:
```cpp
#include <iostream>
#include <sstream>
#include <cstring>
// 假设 ldtoms 函数已实现
void ldtoms(long double num, char* result);
int main() {
long double input;
char result[100];
while (std::cin >> input) {
ldtoms(input, result);
std::cout << result << std::endl;
}
return 0;
}
```
#### 4. bMoney 类的创建
创建一个 `bMoney` 类,用于存储货币金额,以 `long double` 类型存储。该类包含以下成员函数:
- `mstold()`:将输入的货币字符串转换为 `long double`。
- `ldtoms()`:将 `long double` 转换为货币字符串用于显示。
- `getmoney()`:输入货币字符串。
- `putmoney()`:输出货币字符串。
- `madd()`:将两个 `bMoney` 对象的金额相加。
以下是 `bMoney` 类的定义:
```cpp
class bMoney
{
private:
long double money;
public:
bMoney();
bMoney(char s[]);
void madd(bMoney m1, bMoney m2);
void getmoney();
void putmoney();
};
```
#### 5. 运算符重载概述
运算符重载是面向对象编程中非常令人兴奋的特性之一,它可以将复杂、晦涩的程序代码转换为直观易懂的形式。例如,原本像 `d3.addobjects(d1, d2);` 或 `d3 = d1.addobjects(d2);` 这样的语句,可以转换为更易读的 `d3 = d1 + d2;`。运算符重载指的是为 C++ 中的普通运算符(如 `+`、`*`、`<=` 和 `+=`)赋予在用户自定义数据类型上的额外含义。通常,`a = b + c;` 仅适用于基本类型(如 `int` 和 `float`),若 `a`、`b` 和 `c` 是用户自定义类的对象,编译器会报错。但通过运算符重载,即使它们是用户自定义类型,该语句也能合法使用。
#### 6. 一元运算符重载
一元运算符只作用于一个操作数,例如 `++`、`--` 和一元负号 `-`。以 `Counter` 类为例,原本通过调用成员函数 `c1.inc_count();` 来增加计数器的值,若使用运算符重载,我们可以直接使用 `++c1;`。
以下是 `COUNTPP1` 程序示例:
```cpp
// countpp1.cpp
// 使用 ++ 运算符递增计数器变量
#include <iostream>
using namespace std;
class Counter
{
private:
unsigned int count; // 计数器
public:
Counter() : count(0) // 构造函数
{ }
unsigned int get_count() // 返回计数器值
{ return count; }
void operator ++ () // 前缀递增
{
++count;
}
};
int main()
{
Counter c1, c2; // 定义并初始化
cout << "\nc1=" << c1.get_count(); // 显示
cout << "\nc2=" << c2.get_count();
++c1; // 递增 c1
++c2; // 递增 c2
++c2; // 递增 c2
cout << "\nc1=" << c1.get_count(); // 再次显示
cout << "\nc2=" << c2.get_count() << endl;
return 0;
}
```
该程序的输出结果为:
```
c1=0
c2=0
c1=1
c2=2
```
在这个程序中,`operator ++ ()` 函数用于递增 `count` 变量。但该函数存在一个小缺陷,若在 `main()` 函数中使用 `c1 = ++c2;` 语句,编译器会报错,因为 `operator ++ ()` 函数的返回类型为 `void`,而赋值语句要求返回 `Counter` 类型的变量。为了解决这个问题,我们可以修改函数使其返回一个值,如 `COUNTPP2` 程序所示:
```cpp
// countpp2.cpp
// 使用 ++ 运算符递增计数器变量并返回值
#include <iostream>
using namespace std;
class Counter
{
private:
unsigned int count; // 计数器
public:
Counter() : count(0) // 构造函数
{ }
unsigned int get_count() // 返回计数器值
{ return count; }
Counter operator ++ () // 递增计数器
{
++count; // 递增计数器
Counter temp; // 创建一个临时 Counter 对象
temp.count = count; // 赋予临时对象相同的值
return temp; // 返回临时对象
}
};
int main()
{
Counter c1, c2; // c1=0, c2=0
cout << "\nc1=" << c1.get_count();
```
0
0
复制全文
相关推荐










