浅析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;
}