C++运算符重载

RDX*_*RDX 15 c++ class operator-overloading

为什么下面的C++程序输出"ACCA"?为什么operator int()叫两次?

#include "stdafx.h"
#include <iostream>

using namespace std;

class Base {
public:
    Base(int m_var=1):i(m_var){
        cout<<"A";
    }
    Base(Base& Base){
        cout<<"B";
        i=Base.i;
    }
    operator int() {
        cout<<"C";
        return i;
    }
private:
    int i;
};

int main()
{
    Base obj;
    obj = obj+obj;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 30

首先,这一行:

Base obj;
Run Code Online (Sandbox Code Playgroud)

Default- obj通过选择接受带有默认值的整数的构造函数来构造对象1.这是第一次A打印到标准输出.

然后,这个表达式:

obj + obj
Run Code Online (Sandbox Code Playgroud)

需要选择一个可行的超载operator +.在这种情况下,由于obj具有用户定义的转换int,因此选择内置operator +,并将两个参数转换为int.这是负责C打印到标准输出的两个s.

然后,分配到obj:

obj = obj + obj
Run Code Online (Sandbox Code Playgroud)

需要调用隐式生成operator =Base.隐式生成的operator =签名:

Base& operator = (Base const&);
Run Code Online (Sandbox Code Playgroud)

这意味着int必须将等号右侧的表达式转换为Base从中obj分配的临时对象(隐式生成的引用参数operator =绑定到此临时对象).

但是这个临时的创建int反过来要求调用再次Base接受的转换结构int,它负责将第二个A打印到标准输出.


Ian*_*ney 9

operator int()被调用两次,因为你没有超载operator+.编译器不知道如何将a添加Base到a Base,因此它们被转换为int(因为你教它如何做到这一点),它知道如何做.以下代码打印ADA:

#include <iostream>

using namespace std;

class Base {
public:
    Base(int m_var=1):i(m_var){
        cout<<"A";
    }
    Base(Base& Base){
        cout<<"B";
        i=Base.i;
    }
    operator int() {
        cout<<"C";
        return i;
    }
    int operator+(Base& Base)
    {
        cout<<"D";
        return i+Base.i;
    }
private:
    int i;
};

int main()
{
    Base obj;
    obj = obj+obj;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 5

构造对象时,得到第一个"A":

 Base obj;
Run Code Online (Sandbox Code Playgroud)

当您指定要添加obj+obj,编译器需要想出一个办法使用+obj.由于您没有覆盖operator+for Base,因此int()为等式的每一侧调用转换:

obj+obj
Run Code Online (Sandbox Code Playgroud)

这打印"CC".

然后,分配给obj,类型为Base,所以运行可以接受int(i + i来自int()运算符)的构造函数,打印"A":

obj = obj+obj; // Assignment prints "A"
Run Code Online (Sandbox Code Playgroud)


Okt*_*ist 5

obj = obj+obj;
      ^^^--------obj converted to int here
          ^^^----obj converted to int here
^^^^^------------Base(int) ctor and default operator= called here
Run Code Online (Sandbox Code Playgroud)

除非您了解成本并了解特定情况下的收益超过它们,否则重载强制转换操作符通常不是一个好主意.