ostream运算符重载

时间:2012-04-22 13:11:07

标签: c++ operator-overloading

我有一个名为Dollars的班级

    class Dollars
    {
    private:
            int dollars;
    public:
    Dollars(){}
    Dollars(int doll)
    {
            cout<<"in dollars cstr with one arg as int\n";
            dollars = doll;
    }
    Dollars(Cents c)
    {
            cout<<"Inside the constructor\n";
            dollars = c.getCents()/100;
    }
    int getDollars()
    {
            return dollars; 
    }
    operator int()
    {
            cout<<"Here\n";
            return (dollars*100);
    }

    friend ostream& operator << (ostream& out, Dollars& dollar)
    {
            out<<"output from ostream in dollar is:"<<dollar.dollars<<endl;  
            return out;
    }
    };

    void printDollars(Dollars dollar)
    {
            cout<<"The value in dollars is "<< dollar<<endl;
    }

    int main()
    {
            Dollars d(2);
            printDollars(d);
            return 0;
    }

在上面的代码中,如果我删除了重载的ostream运算符,那么它将转到

    operator int()
    {
            cout<<"Here\n";
            return (dollars*100);
    }

但是在提供ostream重载时它不会去那里。

我的困惑

Why isn't there any return type for operator int() function as far as my understanding says that all functions in C++ should have a return type or a void except the constructors.

我可以在那里提供一些用户定义的数据类型而不是int吗?

我应该在什么情况下使用此功能?

1 个答案:

答案 0 :(得分:3)

这种类型的运算符称为conversion function。在您的情况下,它会从Dollars转换为int。该语法是标准的,您不能指定返回类型(您已经说明了类型)。

如果需要,您可以为自定义类型创建转换运算符。你可以:

operator Yen() { ... }
operator Euro() { ... }

然后可以使用这些函数将Dollar的实例隐式转换为YenEuro,而无需使用强制转换(或构造函数取Dollar YenEuro类。

“C ++ 03”标准(§12.3.2/ 2)中的示例:

class X {
 // ...
 public:
 operator int();
};

void f(X a)
{
 int i = int(a);
 i = (int)a;
 i = a;
}

C ++ 11允许将转换函数标记为 explicit 。在这种情况下,转换功能仅在直接初始化期间考虑。 (这通常是避免意外转换的好事,特别是对于基本类型。)标准中的例子是(§12.3.2/ 2):

class Y { };
struct Z {
 explicit operator Y() const;
};

void h(Z z) {
 Y y1(z);     // OK: direct-initialization
 Y y2 = z;    // ill-formed: copy-initialization
 Y y3 = (Y)z; // OK: cast notation
}

(而C ++ 11指出转换函数不能声明 static 。)