运算符重载 << >>流插入符 流提取符
### 运算符重载与流插入符、流提取符详解 #### 一、运算符重载概述 在C++中,运算符重载是一种特殊形式的函数重载,允许我们为用户定义的类型(例如类或结构体)提供已有的运算符行为。通过这种方式,我们可以使自己的类型支持如`+`、`-`、`*`等标准运算符,甚至是一些特殊的运算符如`<<`(流插入符)和`>>`(流提取符)。 #### 二、流插入符(<<) 流插入符`<<`通常用于将数据输出到流对象,如`std::cout`。当用于用户自定义类型时,需要定义一个友元函数来实现这个操作。该函数通常接受一个`std::ostream&`类型的参数以及一个用户自定义类型的引用作为参数,并返回`std::ostream&`类型的引用。 在给定的代码示例中,`vector`类的流插入符`<<`被定义为: ```cpp friend ostream& operator<<(ostream& output, vector& ary) { for (int i = 0; i < ary.len; i++) output << ary[i] << " "; output << endl; return output; } ``` 这段代码实现了将`vector`对象中的元素逐个输出到输出流中。这里使用了范围循环来遍历`vector`对象中的每个元素,并将其输出到输出流`output`中。 #### 三、流提取符(>>) 流提取符`>>`主要用于从输入流读取数据,如`std::cin`。与流插入符类似,为了支持自定义类型,也需要定义一个友元函数来实现这个操作。该函数接受一个`std::istream&`类型的参数以及一个用户自定义类型的引用作为参数,并返回`std::istream&`类型的引用。 在给定的代码示例中,`vector`类的流提取符`>>`被定义为: ```cpp friend istream& operator>>(istream& input, vector& ary) { for (int i = 0; i < ary.len; i++) input >> ary[i]; return input; } ``` 这段代码实现了从输入流`input`中读取数据并填充到`vector`对象的每个元素中。同样地,这里使用了范围循环来读取每个元素。 #### 四、`vector`类的定义与实现 给定的代码中定义了一个简单的`vector`类,它包含了一些基本的操作: 1. **构造函数**:初始化`vector`对象的大小和内存。 - `vector(int size = 1)`:构造函数接受一个可选的整型参数`size`,表示`vector`的初始大小。如果`size`小于等于0或者大于100,则程序会抛出异常并终止执行。 2. **析构函数**:释放分配给`vector`的内存。 3. **下标运算符**:提供对`vector`内部元素的访问。 - `int& operator[](int i)`:如果索引`i`在有效范围内,则返回对应位置的元素;否则,抛出异常并终止执行。 4. **流插入符**:用于输出`vector`中的所有元素。 5. **流提取符**:用于从输入流中读取数据并存储到`vector`中。 #### 五、主函数 主函数中展示了如何创建一个`vector`对象,以及如何使用流插入符和流提取符进行输入输出操作。 1. **获取向量长度**:通过`cin`读取用户输入的`vector`长度。 2. **创建`vector`对象**:根据用户输入的长度创建一个`vector`对象。 3. **输入元素**:使用流提取符`>>`从`cin`读取用户输入的数据,并填充到`vector`对象中。 4. **输出元素**:使用流插入符`<<`将`vector`对象中的元素输出到`cout`上。 #### 六、总结 本篇文章介绍了C++中运算符重载的概念,特别是流插入符`<<`和流提取符`>>`的应用。通过具体的代码示例,我们了解了如何为用户自定义类型实现这些运算符,以及如何在实际编程中使用它们来进行输入输出操作。理解这些概念对于编写高效、易于维护的C++程序至关重要。