C++重载插入运算符(<<)和提取运算符(>>)详解

C++重载插入运算符(<<)和提取运算符(>>)详解,第1张

概述必须为任何想和输出流迭代器一起使用的类类型重载插入和提取运算符。对于自己的类,这是很容易的事。必要的话,可以提供 get 和 set 函数来访问任何 private 或 public 数据成员,或者 必须为任何想和输出流迭代器一起使用的类类型重载插入和提取运算符。对于自己的类,这是很容易的事。必要的话,可以提供 get 和 set 函数来访问任何 private 或 public 数据成员,或者将运算符函数指定为友元函数。下面是一个简单的示例,有一个表示姓名的类可以说明:
class name{private:    std::string first_name{};    std::string second_name{};public:    name() = default;    name(const std::strings first,const std::strings second):first_name{first},second name {second} {}    frIEnd std::istream& operator>>(std::istream& in,name& name);    frIEnd std::ostream& operator<<(std::ostream& out,const name& name);};// Extraction operator for name objectsinline std::istream& operator>>(std::istream& in,name& name){ return in >> name.first_name >> name.second_name; }//Insertion operator for name objectsinline std::ostream& operator<<(std::ostream& out,const name& name){ return out << name.first_name << ' ' << name.second_name; }
这里定义了运算符的重载,可以像这个示例一样,用流迭代器来读和写 name 对象:
std::cout << "Enter names as first_name second_name. Enter Ctrl+Z on a separate line to end:\n";std::vector<name> names {std::istream_iterator<name> {std::cin},std::istream_iterator<name>{}};std::copy (std::begin (names),std::end (names),std::ostream_iterator<name> {std::cout," "});
names 容器会被输入的 name 对象初始化,直到输入了 Ctrl+Z 来结束输入。copy() 算法会将 name 对象复制到输出流迭代器标识的目的位置,这个迭代器会将对象写到标准输出流中。我们这里的名和姓会阻止姓名按指定的宽度列对齐。例如,下面代码的效果就不会很好:
for(const auto& name: names)    std::cout << std::setw(20) << name << std::endl;
有个主意,就是在单一的列中输出姓名。这个效果也不理想,因为指定的宽度只会被应用到成员 first_name 上。可以通过改变 operator<<() 来做到这一点,因此在输出姓名之前, 会先将它们连接起来:
inline std::ostream& operator<<(std::ostream& out,const name& name){ return out << name.first_name + ' ' + name.second_name; }
这没有原始的 << 高效,因为这种方式会生成临时的 string 对象,但它能够使前面的循环按要求工作。

有时候,可能会想以不同的方式来输出,这取决于目的位置是不是一个文件。例如,我们可能会想在标准输出流的输出中包含一些在将它们写入文件时不想包含的额外信息。这可以通过检查 ostream 对象的实际类型来做到:
inline std::ostreams operator<<(std::ostream& out,const names name){    if(typeID(out) != typeID(std::ostream))        return out << name.first_name << " " << name.second_name;    else        return out << "name: " << name.first_name << ' ' << name.second_name;}
现在,当它被写到 ostream 对象的流时,name 会被带上前缀 "name: "。在输出到文件流或从 ostream 派生的其他流类型中,前缀会被省略。
总结

以上是内存溢出为你收集整理的C++重载插入运算符(<<)和提取运算符(>>)详解全部内容,希望文章能够帮你解决C++重载插入运算符(<<)和提取运算符(>>)详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1231477.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存