C++赋值运算符和重载

C++ assignment operator and overloading

本文关键字:重载 赋值运算符 C++      更新时间:2023-10-16

我想知道为什么以下代码被成功编译。

#include <iostream>
#include <cassert>
using namespace std;
class Integer{
private:
    int i;
public:
    Integer(int value):i(value){}
    // unary or binary
    const Integer operator+(const Integer& rv){
        cout << "operator+"<< endl;
        return Integer(i + rv.i);
    }
    // Binary Operator
    Integer& operator+=(const Integer& rv){
        cout << "operator+=" << endl;
        i += rv.i;
        return *this;
    }
    ostream& operator<<(ostream& lv){
        lv << i;
        return lv;
    }
    friend ostream& operator<< (ostream& lv, Integer& rv);
};
ostream& operator<< (ostream& lv,Integer& rv){
    return lv << rv.i;
}
int main(){
    cout << "using operator overloading"<< endl;
    Integer c(0), a(4), b(5);
    Integer d = 8;
    c = a + b;
    cout << c << endl;
    cout << d << endl;
}

我不明白为什么d=8是可能的。d是用户定义的类型。我没有重载Integer类的赋值oeprator。是否有默认的重载运算符?

您尚未声明Integer构造函数explicit,因此它充当从intInteger的隐式转换。

如果您声明您的构造函数

explicit Integer(int value);

编译器触发错误:

错误:请求从"int"转换为非标量类型"Integer"

您的构造函数定义从int到Integer 的转换

Integer(int value):i(value){}

我不明白为什么d=8是可能的。d是用户定义的类型。

只需对代码进行更多的检测,并跟踪ctor调用即可。

#include <iostream>
#include <cassert>
using namespace std;
class Integer{
private:
    int i;
public:
    Integer(int value):i(value){
        cout << "Integer(int) called with " << value << endl; 
    }
    // unary or binary
    const Integer operator+(const Integer& rv){
        cout << "operator+"<< endl;
        return Integer(i + rv.i);
    }
    // Binary Operator
    Integer& operator+=(const Integer& rv){
        cout << "operator+=" << endl;
        i += rv.i;
        return *this;
    }
    ostream& operator<<(ostream& lv){
        lv << i;
        return lv;
    }
    friend ostream& operator<< (ostream& lv, Integer& rv);
};
ostream& operator<< (ostream& lv,Integer& rv){
    return lv << rv.i;
}
int main(){
    Integer d = 8;
     cout << d << endl;
}

输出:

Integer(int) called with 8
8

在Coliru的上直播

假定的立即数8的赋值实际上会导致以8作为参数调用非显式Integer(int) ctor。