01ストリーム挿入演算子<<過負荷
C ++出力、最も一般的な方法でコンテンツ:
std::cout << 1 <<"hello";
問題:
- なぜこの文は、それを設定することができたのですか?
cout
何ですか?「<<
」演算子で使用することができcout
、その上に?
理由:
- 実際には、
cout
でiostream
定義ヘッダファイルのostream
オブジェクトクラス。 - 「
<<
」それはで使用することができますcout
で、ため一部ostream
のクラス「<<
」されたオーバーロードされました。
以下のためにstd::cout << 1 <<"hello";
この文は、次のようにオーバーロードすることが可能であるostream
メンバ関数を:
ostream & ostream::operator<<(int n)
{
.... // 输出n整型的代码
return *this;
}
ostream & ostream::operator<<(const char * s)
{
.... // 输出s字符串的代码
return *this;
}
std::cout << 1;
声明は同等ですcout.operator<<(1);
std::cout << "hello";
声明は同等ですcout.operator<<("hello");
std::cout << 1 <<"hello";
声明は同等です( cout.operator<<(1) ).operator<<("hello");
<<実施例02ストリーム挿入演算子のオーバーロード
その後、我々は上書きすることができ、我々はプリントアウトの内容にオブジェクトを配置すると仮定しostream
、クラスストリーム挿入<<
演算子を。
下記のCStudent
例のようにクラス:
class CStudent // 学生类
{
public:
// 构造函数
CStudent(int id = 0, int age = 0, string name = ""):m_id(id), m_age(age), m_name(name) { }
// 将该函数声明成友元函数
// 目的是使得函数可以访问CStudent类的私有成员变量
friend ostream & operator<<(ostream & o, const CStudent & s);
private:
int m_age; // 年龄
int m_id; // ID号
string m_name; // 名字
};
// 重载ostream对象的流插入<<运算符函数
// 目的是使得能打印输出CStudent对象的信息
ostream & operator<<(ostream & o, const CStudent & s)
{
o << s.m_id << "," << s.m_age << "," << s.m_name;
return o;
}
int main()
{
CStudent stu(1, 20, "小林coding");
std::cout << stu ; // 输出std对象的全部信息
return 0;
}
出力:
1,20,小林coding
ことに留意すべきostream & operator<<(ostream & o, const CStudent & s)
機能はグローバルなので、関数の最初のパラメータが渡されなければならないostream
オブジェクトとCStudent
、この関数を宣言し、クラスの必要性フレンド機能機能がアクセスできるように、CStudent
プライベートメンバ変数のクラスを。
抽出フロー03 >>演算子のオーバーロードの例
またはにCStudent
一例として、クラス、オブジェクトを初期化するために、あなたがキーボード入力の内容をたいと、私たちは、上書きすることができistream
、クラス抽出>>
演算子を。
class CStudent // 学生类
{
public:
// 构造函数
CStudent(int id = 0, int age = 0, string name = ""):m_id(id), m_age(age), m_name(name) { }
// 将该函数声明成友元函数
// 目的是使得函数可以访问CStudent类的私有成员变量
friend ostream & operator<<(ostream & o, const CStudent & s);
// 将该函数声明成友元函数
// 目的是使得函数可以给CStudent类的私有成员变量进行赋值
friend istream & operator>>(istream & is, CStudent & s);
private:
int m_age; // 年龄
int m_id; // ID号
string m_name; // 名字
};
// 重载ostream对象的流插入<<运算符函数
// 目的是使得能打印输出CStudent对象的信息
ostream & operator<<(ostream & o, const CStudent & s)
{
o << s.m_id << "," << s.m_age << "," << s.m_name;
return o;
}
// 重载istream对象的流提取>>运算符函数
// 目的是使得初始化CStudent对象的内容
istream & operator>>(istream & is, CStudent & stu)
{
string inputStr;
is >> inputStr;
int pos = inputStr.find(",", 0); // 查找首次出现逗号的位置
string tmpStr = inputStr.substr(0, pos); // 截取从0到pos位置的字符串
stu.id = atoi(tmpStr.c_str()); // atoi可以将char*类型的内容转成int类型
int pos2 = inputStr.find(",", pos + 1); // 查找第二次出现逗号的位置
tmpStr = inputStr.substr(pos + 1, pos2 - pos -1); // 取出age的值
stu.age = atoi(tmpStr.c_str()); // atoi可以将char*类型的内容转成int类型
tmpStr = inputStr.substr(pos2 + 1, inputStr.length() - pos2 - 1); // 取出name的值
stu.name = tmpStr;
return is;
}
int main()
{
CStudent stu;
// 将输入的信息,初始化stu对象
cin << stu;
// 输出std对象的信息
cout >> stu;
return 0;
}
入力と出力のコンテンツ内容:
// 输入内容:
1,20,小林coding
// 输出内容:
1,20,小林coding
04まとめ
フロー挿入するには<<
オペレーターをし、抽出>>
演算子は、のためにできるカスタムオブジェクト、そして我々はする必要がリロードオブジェクトのためのostream
クラス<<
と演算子istream
の>>
オペレータ、およびだけすることができ、グローバル関数としてオーバーロードされ、その後、CStudent
クラス宣言された2つのオーバーロード関数の上があることが必要ですフレンド関数 2つのオーバーロードされた機能にアクセスして割り当てることができながら、CStudent
クラスのプライベートメンバ関数。