浅析cout

3395 ワード

coutはiostreamクラスのオブジェクトで、メンバー演算子関数operator<<があり、呼び出されるたびにコンソールに印刷が出力されます.なぜ関数operator<<は、整数、浮動小数点、文字列、ポインタなど、異なる内蔵タイプのデータを受け入れることができるのか、ずっと疑問に思っていました.カスタムタイプをcoutで出力するにはどうすればいいですか?私は次の例で簡単なテストをしました.printfを利用して簡単なmyoutstreamを実現した.2.カスタムクラス(myData)でFriend const myOutstream&operator<(const myOutstream&os,const myData&d)を使用し、myOutstreamオブジェクトmyCoutを使用してプライベートデータnumまたは_を出力str.なぜ友元関数を使うのですか?1.友元関数は非クラスメンバー関数であり、友元関数を使用してクラスのプライベートデータにアクセスすることができる.2.友元関数を使用しない(メンバー関数を使用する)場合、出力することもできますが、myDataのオブジェクトでのみoperator<<を呼び出すことができます.myCout<&d)が実現されています.カスタムタイプでcoutを使用する場合は、それを実装する必要があります. 

#include <cstdio>
using namespace std;

//    myOutstream,    printf   int char*
class myOutstream
{
public:
  const myOutstream& operator<<(int value) const
  {
    printf("*******int********%d
", value); return *this; } const myOutstream& operator<<(char* str) const { printf("*******char*******%s
", str); return *this; } }outS; class myData { public: myData(int i):num(i),_str("hello, world"){} myData( char* str = "hello, world 1"):_str(str) { } // operator+ void operator+(myData t1) { os<<(num+t1.num); } // operator+ friend void operator+(myData t1, myData t2) { outS<< (t1.num + t2.num); } /* // operator<<, num myOutstream& operator<<(myData &d) // { myOutstream os; os<<d.num; } */ // operator<<, _str void operator << (const myData &ob) const // { os << ob._str; //return os; } // operator<<, myData friend const myOutstream& operator<<(const myOutstream &os, const myData &d) { os<<d.num<<d._str; return os; } private: int num; char* _str; myOutstream os; }; int main() { myOutstream myCout; // myOutstream int num = 2015; char *myStr = "Hello, China"; myCout<<num; myCout<<myStr; myData data1(9), data2(10); // operator+ //data1+data2; data1.operator+(data2); // operator+, data1+data2; operator+(data1, data2); // operator+, data1+data2; // operator<< //operator<<(myCout, data1); myCout<<data1; // operator<<, operator<<(myCout, data1); // “<<” myout,myout MyOutstream 。“<<” data1, myData 。 // “<<” myData , “myCout<<data1” operator<<(myCout, data1) myout data1 . myData str("hello, world 2"); str<<str;// <<, 。 return 1; }