您身边的App定制专业企业--10年开发经验为您护航

18678812288
0531-88887250

[c++]重载操作符

文章编辑:2138com太阳集团 时间:2016年12月20日

目录

 

输入和输出操作符

算术操作符和关系操作符

下标操作符

自加、自减操作符

成员访问操作符

1  输入和输出操作符

 

1.1 输出操作符

 

1.1.1 示例

 

复制代码

#include <iostream>

#include <string>

using namespace std;

 

class A

{

    friend ostream& operator<<(ostream& out, const A& a);

    public:

        A(const string &s = "", int v = 0) : ss(s), val(v) {} //构造函数带默认参数

    private:

        int val;

        string ss;

};

 

ostream& operator<<(ostream& out, const A& a)

{

    out << "a.ss:" << a.ss << " " << "a.val:" << a.val;

    return out;

}

 

int main()

{

    A a("hello", 23);

    cout << a << endl;

    A b;

    cout << b << endl;

}

复制代码

结果

 

 

 

1.1.2 说明

 

1)IO操作必须为非成员函数

 

原因:I/O操作的接口返回的是ostream&对象(只有返回左值,这样才可以连续的输出,例如cout << a << b)。自定义的输出操作符应该与其相似。如果将其定义为成员函数(有个首默认参数this,即指向自己的指针),左操作数只能是该类型的对象,则没法办到。例如:Sales_item; item << cout; 与常规定义相反,因此只能为非成员函数。

 

2)因为要访问指定类的私有成员,所以在该类中声明输出操作符为友员函数。

 

3)第一个形参必须为引用。因为I/O对象不可以复制。同理返回值必须为一个引用。

 

4)第一个形参不可以为const,因为写入到流会改变其值。

 

5)第二个为引用,这样可以避免复制。参数可以为const,可以接收const对象和非const对象;否则,如果为非const,则只能接收非coust对象。一般为const,毕竟只是输出而已,不改变对象。

 

 

 

1.2 输入操作符

 

1.2.1 示例

 

复制代码

#include <iostream>

#include <string>

using namespace std;

 

class A

{

    friend ostream& operator<<(ostream& out, const A& a);

    friend istream& operator>>(istream& in, A& a);

    public:

        A(const string &s = "", int v = 0) : ss(s), val(v) {}

    private:

        int val;

        string ss;

};

 

ostream& operator<<(ostream& out, const A& a)

{

    out << "a.ss:" << a.ss << " " << "a.val:" << a.val;

    return out;

}

istream& operator>>(istream& in, A& a)

{

    in >> a.ss >> a.val;

    if(in)

    {

        cout << "Input right" << endl;

    }

    else

    {

        cout << "in.fail:" << in.fail() << endl;

        cout << "input wrong!" << endl;

    }

    return in; 

}

 

int main()

{

    A a("hello", 23);

    cout << a << endl;

    A b;

    cin >> b;

    cout << b << endl;


想要了解更多详情欢迎来电咨询18678812288
登陆网址:www.jnydkj.cn。
联系人:王经理。

XML 地图 | Sitemap 地图