教你快速理解C++中的運算子過載

安全劍客發表於2020-12-08
導讀 在C ++中,我們可以使運算子為使用者定義的類工作。這意味著C ++能夠為運算子提供資料型別的特殊含義,這種能力稱為運算子過載。

在C ++中,我們可以使運算子為使用者定義的類工作。這意味著C ++能夠為運算子提供資料型別的特殊含義,這種能力稱為運算子過載。

教你快速理解C++中的運算子過載教你快速理解C++中的運算子過載

例如,我們可以在String之類的類中過載運算子'+',以便僅使用+就可以連線兩個字串。 算術運算子可能會過載的其他示例類是複數,小數,大整數等。

一個簡單而完整的例子
#includeusing namespace std;  
   
class Complex {  
private:  
    int real, imag;  
public:  
    Complex(int r = 0, int i =0)  {real = r;   imag = i;}  
    Complex operator + (Complex const &obj) {  
         Complex res;  
         res.real = real + obj.real;  
         res.imag = imag + obj.imag;  
         return res;  
    }  
    void print() { cout << real << " + i" << imag << endl; }  
};  
   
int main()  
{  
    Complex c1(10, 5), c2(2, 4);  
    Complex c3 = c1 + c2;  
    c3.print();  
}
操作員功能和普通功能有什麼區別?

操作員功能與普通功能相同。唯一的區別是,運算子的名稱始終是運算子關鍵字,後跟運算子的符號,並且在使用相應的運算子時會呼叫運算子功能。

以下是全域性運算子功能的示例。

#includeusing namespace std;  
   
class Complex {  
private:  
    int real, imag;  
public:  
    Complex(int r = 0, int i =0)  {real = r;   imag = i;}  
    void print() { cout << real << " + i" << imag << endl; }  
 
friend Complex operator + (Complex const &, Complex const &);  
};  
   
   
Complex operator + (Complex const &c1, Complex const &c2)  
{  
     return Complex(c1.real + c2.real, c1.imag + c2.imag);  
}  
   
   
int main()  
{  
    Complex c1(10, 5), c2(2, 4);  
    Complex c3 = c1 + c2;  
    c3.print();  
    return 0;  
}
我們可以讓所有運算子超負荷嗎?

除了少數操作員之外,幾乎所有操作員都可以過載。以下是不能過載的運算子的列表。

為什麼不能。(點),::,?:和sizeof是否過載?

請參閱此以獲取Stroustrup自己的答案。

關於運算子過載的要點

1)為了使運算子過載起作用,至少一個運算元必須是使用者定義的類物件。

2) 賦值運算子:編譯器會自動為每個類建立一個預設的賦值運算子。預設賦值運算子確實將右側的所有成員分配到左側,並且在大多數情況下都可以正常工作(此行為與複製建構函式相同)。請參閱此瞭解更多詳情。

3) 轉換運算子:我們還可以編寫可用於將一種型別轉換為另一種型別的轉換運算子。

#includeusing namespace std;  
class Fraction  
{  
    int num, den;  
public:  
    Fraction(int n,  int d) { num = n; den = d; }  
 
    operator float() const {  
        return float(num) / float(den);  
    }  
};  
   
int main() {  
    Fraction f(2, 5);  
    float val = f;  
    cout << val;  
    return 0;  
}

過載的轉換運算子必須是成員方法。其他運算子可以是成員方法或全域性方法。

4)任何可以用單個引數呼叫的建構函式都可以用作轉換建構函式,這意味著它也可以用於隱式轉換為正在構造的類。

#includeusing namespace std;  
   
class Point  
{  
private:  
    int x, y;  
public:  
    Point(int i = 0, int j = 0) {  
        x = i;   y = j;  
    }  
    void print() {  
        cout << endl << " x = " << x << ", y = " << y;  
    }  
};  
   
int main() {  
    Point t(20, 20);  
    t.print();  
    t = 30;    
    t.print();  
    return 0;  
}

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2740509/,如需轉載,請註明出處,否則將追究法律責任。

相關文章