C++赋值运算符和重载

4
我在想为什么以下代码能够成功编译。
#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类重载赋值运算符。是否有默认的重载运算符?


这个网站很好地描述了显式/隐式构造函数:http://en.cppreference.com/w/cpp/language/explicit - jensa
3个回答

7
你没有声明 Integer 构造函数为 explicit,所以它会将 int 隐式转换为 Integer
如果你声明了你的构造函数:
explicit Integer(int value);

编译器报错如下:
错误:请求将“int”转换为非标量类型“Integer”。

2

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

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

1

我不明白为什么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,实际上导致非显式Integer(int)构造函数被调用,以8作为其参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接