簡體   English   中英

C ++賦值運算符和重載

[英]C++ assignment operator and overloading

我想知道為什么以下代碼正在成功編譯。

#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's

事實上,假定的立即8的賦值導致非顯式的 Integer(int) ctor被調用,其中8作為其參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM