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打印到标准输出.
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)
        构造对象时,得到第一个"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)
        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)
除非您了解成本并了解特定情况下的收益超过它们,否则重载强制转换操作符通常不是一个好主意.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           874 次  |  
        
|   最近记录:  |