我有一个名为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吗?
我应该在什么情况下使用此功能?
答案 0 :(得分:3)
这种类型的运算符称为conversion function。在您的情况下,它会从Dollars
转换为int
。该语法是标准的,您不能指定返回类型(您已经说明了类型)。
如果需要,您可以为自定义类型创建转换运算符。你可以:
operator Yen() { ... }
operator Euro() { ... }
然后可以使用这些函数将Dollar
的实例隐式转换为Yen
或Euro
,而无需使用强制转换(或构造函数取Dollar
Yen
或Euro
类。
“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 。)