柚子快報(bào)邀請(qǐng)碼778899分享:算法 【C++】運(yùn)算符重載詳解
柚子快報(bào)邀請(qǐng)碼778899分享:算法 【C++】運(yùn)算符重載詳解
?個(gè)人主頁(yè)? ?個(gè)人專欄——C++學(xué)習(xí)? ?點(diǎn)擊關(guān)注朗一起學(xué)習(xí)C語(yǔ)言??
目錄
導(dǎo)讀
1. 為什么需要運(yùn)算符重載
2. 運(yùn)算符重載概念
3. 運(yùn)算符重載示例
3.1 == 運(yùn)算符重載
3.2 >或<運(yùn)算符
4. 運(yùn)算符重載參數(shù)
5. 全局運(yùn)算符重載函數(shù)
6. 賦值運(yùn)算符重載
6.1 語(yǔ)法及概念
6.2 示例
6.3 為何使用引用
導(dǎo)讀
前面我們學(xué)習(xí)了默認(rèn)成員函數(shù):構(gòu)造函數(shù)、析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù)。
今天我們來學(xué)習(xí)賦值運(yùn)算符重載。
1. 為什么需要運(yùn)算符重載
我們一般的運(yùn)算符只能對(duì)于數(shù)字進(jìn)行運(yùn)算,或是比較大小,但是如果我們想要對(duì)我們所定義的自定義類型進(jìn)行運(yùn)算呢?
為了使自定義類型能夠支持運(yùn)算符操作,可以通過運(yùn)算符重載的方式來重新定義這些運(yùn)算符,使其能夠在自定義類型上執(zhí)行特定的操作。
比如我們定義了一個(gè)日期類,想要對(duì)這個(gè)日期類進(jìn)行加減運(yùn)算,亦或是比較兩個(gè)日期的大小,通過運(yùn)算符重載即可實(shí)現(xiàn)。
2. 運(yùn)算符重載概念
C++為了增強(qiáng)代碼的可讀性引入了運(yùn)算符重載,運(yùn)算符重載是具有特殊函數(shù)名的函數(shù),也具有其 返回值類型,函數(shù)名字以及參數(shù)列表,其返回值類型與參數(shù)列表與普通的函數(shù)類似。
函數(shù)名字為:關(guān)鍵字operator后面接需要重載的運(yùn)算符符號(hào)。
函數(shù)原型:返回值類型?operator操作符(參數(shù)列表)
一般來說需要遵循以下幾個(gè)原則:
運(yùn)算符的重載必須定義在類、結(jié)構(gòu)體或枚舉中。 運(yùn)算符重載函數(shù)必須使用特殊的命名約定,以指示要重載的運(yùn)算符。 運(yùn)算符重載函數(shù)可以是類的成員函數(shù),也可以是非成員函數(shù)。 運(yùn)算符重載函數(shù)的參數(shù)和返回值類型應(yīng)該與運(yùn)算符原有的操作數(shù)類型相匹配。 運(yùn)算符重載函數(shù)可以使用其他的運(yùn)算符或已有的函數(shù)來實(shí)現(xiàn)其操作。
3. 運(yùn)算符重載示例
3.1 == 運(yùn)算符重載
我們來判斷兩個(gè)日期是否相等:
我們需要依次比較年、月、日。
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//operator運(yùn)算符 做函數(shù)名
bool operator == (const Date& y)
{
return _year == y._year
&& _month == y._month
&& _day == y._day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2024, 2, 02);
Date d2(2024, 2, 03);
cout << d1.operator == (d2) << endl;
return 0;
}
我們知道,運(yùn)算符重載也是默認(rèn)成員函數(shù)之一,也就是我們不去調(diào)用,編譯器也會(huì)自動(dòng)幫我們調(diào)用。
比如:
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//operator運(yùn)算符 做函數(shù)名
bool operator == (const Date& y)
{
return _year == y._year
&& _month == y._month
&& _day == y._day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2024, 2, 3);
Date d2(2024, 2, 2);
cout << d1.operator == (d2) << endl;
cout << (d1 == d2) << endl;
return 0;
}
3.2 >或<運(yùn)算符
判斷兩個(gè)日期的大?。?/p>
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//operator運(yùn)算符 做函數(shù)名
bool operator < (const Date& y)
{
if (_year < y._year)
{
return true;
}
else if (_year == y._year)
{
if (_month < y._month)
{
return true;
}
else if (_month == y._month)
{
return _day < y._day;
}
}
return false;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2024, 1, 28);
Date d2(2024, 1, 29);
cout << d1.operator < (d2) << endl;
cout << (d1 < d2) << endl;
return 0;
}
4. 運(yùn)算符重載參數(shù)
上述我們的代碼明明是對(duì)兩個(gè)日期進(jìn)行比較,為何只有一個(gè)參數(shù)呢?
運(yùn)算符重載函數(shù)的參數(shù)取決于要重載的運(yùn)算符的操作數(shù)個(gè)數(shù)和類型。
一元運(yùn)算符重載:一元運(yùn)算符只有一個(gè)操作數(shù)。在重載一元運(yùn)算符時(shí),通常將其定義為類的成員函數(shù),沒有參數(shù)(除了隱式的this指針)。 二元運(yùn)算符重載:二元運(yùn)算符有兩個(gè)操作數(shù)。在重載二元運(yùn)算符時(shí),可以選擇將其定義為類的成員函數(shù)或非成員函數(shù)。
如果將二元運(yùn)算符定義為類的成員函數(shù),參數(shù)列表將包括一個(gè)額外的參數(shù),表示右側(cè)操作數(shù)。左側(cè)操作數(shù)則是隱式的this指針。 如果將二元運(yùn)算符定義為非成員函數(shù)(全局函數(shù)或友元函數(shù)),參數(shù)列表將包括兩個(gè)參數(shù),分別表示左側(cè)和右側(cè)操作數(shù)。
5. 全局運(yùn)算符重載函數(shù)
我們依舊對(duì)比兩個(gè)日期是否相等,判斷大小,注意與上述代碼的參數(shù)差異。
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//private:
int _year;
int _month;
int _day;
};
//operator運(yùn)算符 做函數(shù)名
bool operator == (const Date& x, const Date& y)
{
return x._year == y._year
&& x._month == y._month
&& x._day == y._day;
}
bool operator < (const Date& x, const Date& y)
{
if (x._year < y._year)
{
return true;
}
else if (x._year == y._year)
{
if (x._month < y._month)
{
return true;
}
else if (x._month == y._month)
{
return x._day < y._day;
}
}
return false;
}
int main()
{
Date d1(2024, 1, 28);
Date d2(2024, 1, 29);
cout << operator == (d1, d2) << endl;
cout << operator < (d1, d2) << endl;
cout << (d1 == d2) << endl;
cout << (d1 < d2) << endl;
return 0;
}
6. 賦值運(yùn)算符重載
6.1 語(yǔ)法及概念
賦值運(yùn)算符重載是一種特殊的運(yùn)算符重載,用于在自定義的類中重載"="運(yùn)算符,使其能夠?qū)︻悓?duì)象進(jìn)行正確的賦值操作。
賦值運(yùn)算符重載的語(yǔ)法如下:
class ClassName {
public:
ClassName& operator=(const ClassName& other) {
// 執(zhí)行賦值操作的代碼
return *this;
}
};
在賦值運(yùn)算符重載函數(shù)中,通常需要執(zhí)行以下操作:
檢查是否是自我賦值,即當(dāng)前對(duì)象和要賦值的對(duì)象是否是同一個(gè)對(duì)象。如果是同一個(gè)對(duì)象,則直接返回當(dāng)前對(duì)象,避免不必要的操作。 進(jìn)行屬性的深拷貝,將要賦值的對(duì)象的屬性逐個(gè)復(fù)制給當(dāng)前對(duì)象的屬性。 返回當(dāng)前對(duì)象的引用。
6.2 示例
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << '/' << _month << '/' << _day << endl;
}
Date& operator=(const Date& d)
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2024, 2, 01);
Date d2(2024, 2, 02);
Date d3(2024, 2, 03);
d1 = d2 = d3;
d1.Print();
d2.Print();
d3.Print();
return 0;
}
6.3 為何使用引用
引用參數(shù):賦值運(yùn)算符需要修改當(dāng)前對(duì)象的值,而不是創(chuàng)建一個(gè)新的對(duì)象。因此,使用引用參數(shù),可以直接修改當(dāng)前對(duì)象而不是在函數(shù)內(nèi)部創(chuàng)建一個(gè)副本。 返回this指針:賦值運(yùn)算符一般返回當(dāng)前對(duì)象的引用,即*this。這樣可以實(shí)現(xiàn)連續(xù)賦值操作,例如 a = b = c。通過返回this指針,可以鏈?zhǔn)秸{(diào)用賦值運(yùn)算符。
柚子快報(bào)邀請(qǐng)碼778899分享:算法 【C++】運(yùn)算符重載詳解
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。