运算符重载[运算符A()const]

时间:2014-11-26 12:57:11

标签: c++ operator-overloading

在下面有一个名为B的预定义类:

class B
{
    protected:
        A ins;
    public:
        void print() {
            cout<<"t";
        }
        operator A() const {
            return ins; 
        }
};

任何人都可以解释一下这条线的含义&#34;运算符A()const&#34;以及如何使用它来获取&#34; ins&#34;在主要功能?

2 个答案:

答案 0 :(得分:1)

这是一个转换运算符,允许将B对象转换为(强制转换为)A对象。 让我们分解operator A() const {...}

它等同于A convert_to_A() { return ins; }之类的东西,除了通过命名它operator A,编译器可以自动使用它。

operator A表示这是一个转换为A类的运算符。

():转化运算符始终是不带参数的函数。

const因为将B投射到A 不得更改B 的值。例如:

double d = 3.14;
int i = d;

这里d已被(隐含)强制转换为int。 i的值为3,但d仍为3.14 - 转换更改原始值。

在代码的上下文中,我们可以说:

  1. B对象包含隐藏的A对象
  2. 每个B都愿意“假装”成为A ......
  3. ...通过返回其中的A副本
  4. 允许:

    void f(A an_a) {...}
    
    B my_b;
    f(my_b);
    

    请注意,转换运算符会返回 ins的副本。根据上下文,您可能希望将其更改为operator A&() const {...}以返回引用而不是副本(例如,如果A是要复制的昂贵类)。但是,这将允许调用者更改存储在B中的A,这可能不是您想要的。要防止复制,但不允许更改,您必须将const引用返回给A.这就是您经常看到的原因:

    operator const A&() const { return ins;}
    

答案 1 :(得分:0)

这意味着您可以将B实例转换为A并获取B的ins成员。

B b;
A a;

a = (A)b;

// a is now equal to the member `ins` of b. Depending on the implementation of operator = of class A, it was probably copied into the a variable.