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