这是构造函数运算符还是转换运算符?

时间:2014-06-11 11:01:24

标签: c++

class B
{
    public:
        operator B() const{ }    // What is this and what is the purpose?

    private:
        int m_i;
};

所以问题是,转换运算符或构造函数运算符是什么用的呢?在哪里使用它?

2 个答案:

答案 0 :(得分:13)

这是一个永远不会被隐式调用的转换函数。该标准实际上深入探讨了这个问题。 12.3.2 / 1:

  

转换函数永远不会用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为(可能是cv限定的)基类类型(或对它的引用),或(可能是cv-qualified)void。

在脚注中,

  

这些转换被视为标准转换,用于重载解析(13.3.3.1,13.3.3.1.4),因此初始化(8.5)和显式转换(5.2.9)。转换为void不会调用任何转换函数(5.2.9)。即使从未直接调用执行转换,也可以声明这样的转换函数,并且可以通过调用基类中的虚拟转换函数来实现。

此外,转换函数仍然是普通函数,可以通过名称显式调用。

关于虚函数的注释适用于这样的代码:

class B;

struct A {
    virtual operator B() const = 0;
};

struct B : A
{
    public:
        operator B() const{ return B(); } // virtual override

    private:
        int m_i;
};

A const & q = B(); // q has dynamic type B, static type A
B r = q; // Convert A to B using B::operator B()

迂腐说明:“转换运营商”的术语很差。这些被称为转换函数,尽管有operator关键字,但它们不被认为是运算符重载的情况。

答案 1 :(得分:1)

它是转化运营商。它允许您将类型为B的对象强制转换为B类型的对象。