「<<」と「>>」を抽出演算子のオーバーロードにC ++ストリーム

01ストリーム挿入演算子<<過負荷

C ++出力、最も一般的な方法でコンテンツ:

std::cout << 1 <<"hello";

問題:

  • なぜこの文は、それを設定することができたのですか?
  • cout何ですか?<<」演算子で使用することができcout、その上に?

理由:

  • 実際には、coutiostream定義ヘッダファイルの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クラスのプライベートメンバ関数。

おすすめ

転載: www.cnblogs.com/xiaolincoding/p/11969861.html