关于ostream运算符的问题<<

时间:2010-10-27 18:22:10

标签: c++ operator-overloading

假设我创建了一个包含char数组的类。现在,操作员处理这个:

myClass inst;
cout << inst;

在“cout&lt;&lt; inst;”什么叫,只是通过班级的名字? 感谢。

5 个答案:

答案 0 :(得分:12)

所谓的是std::ostream &operator<<(std::ostream &, myClass const &)。如果需要,可以重载此内容。

答案 1 :(得分:4)

通过创建朋友输出操作符,如下例所示。

#include <iostream>

class MyClass {
  friend std::ostream & operator<<(std::ostream &out, const MyClass &inst);
public:
  // ... public interface ...
private:
  char array[SOME_FIXED_SIZE];
};

std::ostream & operator<<(std::ostream &out, const MyClass &inst)
{
   out.write(inst.array, SOME_FIXED_SIZE);
   return out;
}

请不要对“char数组”的含义做出一些假设,如果你的char数组实际上是nul(0个字符)终止,它会大大简化。

更新:我会说这不是严格意义上的类的返回值,而是类的文本表示 - 您可以自由定义。

答案 2 :(得分:2)

编译器将查找operator<<的重载。特别是,它将查找std::ostream(不存在)的成员函数重载或自由函数,您应该使用以下原型重载:

std::ostream &operator<< (std::ostream &os, const myClass &x);

如果您需要访问受保护/私人会员,您可能需要将其设为myClass的朋友。

答案 3 :(得分:2)

这导致编译器错误,除非你有一个ostream知道的某种类型的重载类型转换操作符。您可以通过重载全局ostream& operator(ostream& os, const myClass& x)或使您的类型可转换为字符串/ int等来将您自己的类型添加到ostream知道的类型中。但是请注意,类型转换重载可以将您射入脚中并被视为糟糕的做法。

最简单的方法是从类中打印一些变量:

myClass inst;
cout << inst.getName() << ": " << inst.getSomeValue();

答案 4 :(得分:1)

为了能够使用std::cout << someClass,您必须创建如下的运算符:

std::ostream &operator<< (std::ostream &, const someClass &);