国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

運算符重載和重載函數(shù)

這篇具有很好參考價值的文章主要介紹了運算符重載和重載函數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.運算符重載的意義

C++為了增強代碼的可讀性引入了運算符重載,運算符重載是具有特殊函數(shù)名的函數(shù),也具有其返回值類型,函數(shù)名字以及參數(shù)列表,其返回值類型與參數(shù)列表與普通的函數(shù)類似。
函數(shù)名字為:關鍵字operator后面接需要重載的運算符符號。
函數(shù)原型:返回值類型 operator操作符(參數(shù)列表)

當您調用一個重載函數(shù)或重載運算符時,編譯器通過把您所使用的參數(shù)類型與定義中的參數(shù)類型進行比較,決定選用最合適的定義。選擇最合適的重載函數(shù)或重載運算符的過程,稱為重載決策。

在同一個作用域內,可以聲明幾個功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個數(shù)、類型或者順序)必須不同。您不能僅通過返回類型的不同來重載函數(shù)。

注意:

  • 不能通過連接其他符號來創(chuàng)建新的操作符:比如operator@
  • 重載操作符必須有一個類類型參數(shù)
  • 用于內置類型的運算符,其含義不能改變,例如:內置的整型+,不 能改變其含義
  • 作為類成員函數(shù)重載時,其形參看起來比操作數(shù)數(shù)目少1,因為成員函數(shù)的第一個參數(shù)為隱藏的this
  • .* sizeof ?: . ::?#注意以上6個運算符不能重載。切記

2.運算符重載的使用

通過實現(xiàn)一個日期類函數(shù),學習運算符重載的使用

先來寫一個類用來實現(xiàn)日期類的創(chuàng)建

class Date
{
    //友元函數(shù)
	friend ostream& operator<<(ostream& out, const Date& date);
	friend ostream& operator>>(istream& in, Date& date);
public:
	Date(int year = 0, int month = 0, int day = 0)
	{
		_year = year;
		_month = month;
		_day = day;
		cout << "創(chuàng)建" << _year << endl;
	}

	~Date()
	{
		cout << "銷毀" << _year << endl;
	}
	//拷貝構造函數(shù)
	Date(Date& date)
	{
		cout << "1" << endl;
		_year = date._year;
		_month = date._month;
		_day = date._day;
	}
	//void Print();
	//判斷兩個日期是否相等
	bool operator==(const Date& days);
    //判斷前一個日期是否大于等于后一個日期
	bool operator>=(const Date& days);
    //判斷前一個日期是否小于等于后一個日期
	bool operator<=(const Date& days);
    //判斷前一個日期是否大于后一個日期
	bool operator>(const Date& days);
    //判斷前一個日期是否小于后一個日期
	bool operator<(const Date& days);
    //判斷兩個日期是否不相等
	bool operator!=(const Date& days);

    //日期加一個天數(shù),返回一個日期,改變原日期
	Date& operator+=(int days);
    //日期加一個天數(shù),返回另一個日期,原日期不變
	Date operator+(int days);
    //日期減天數(shù),返回一個日期,原日期改變
	Date& operator-=(int days);
    //日期減日期,返回一個天數(shù)
	int operator-=(Date& days);
    
    Date& operator--();
	Date& operator--(int) ;
	Date& operator++();
	Date& operator++(int) ;



private:
	int _year;
	int _month;
	int _day;
};

//重載流提取
ostream& operator<<(ostream& out, const Date& date);
//重載流插入
ostream& operator>>(istream& in, Date& date);

3.友元函數(shù):(臨時插入)

類的友元函數(shù)是定義在類外部,但有權訪問類的所有私有(private)成員和保護(protected)成員。盡管友元函數(shù)的原型有在類的定義中出現(xiàn)過,但是友元函數(shù)并不是成員函數(shù)。

友元可以是一個函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。

如果要聲明函數(shù)為一個類的友元,需要在類定義中該函數(shù)原型前使用關鍵字?friend。

注意:友元提供了一種突破封裝的方式,有時提供了便利。但是友元會增加耦合度,破壞了封裝,所以友元不宜多用。

說明:

  • 友元函數(shù)可訪問類的私有和保護成員,但不是類的成員函數(shù)
  • 友元函數(shù)不能用const修飾
  • 友元函數(shù)可以在類定義的任何地方聲明,不受類訪問限定符限制
  • 一個函數(shù)可以是多個類的友元函數(shù)
  • 友元函數(shù)的調用與普通函數(shù)的調用原理相同
    ?

友元類下次再說

4.日期類函數(shù)的實現(xiàn)

4.1打印函數(shù)

/打印函數(shù),用下面的流插入流體取實現(xiàn)
//void Date::Print()
//{
//	cout << _year << " "
//		<< _month << " "
//		<< _day << endl;
//}

4.2 比較運算符的實現(xiàn)

//相等
bool Date::operator==(const Date& days) const
{
	return _year == days._year &&
		_month == days._month &&
		_day == days._day;
}
//大于
bool Date::operator>(const Date& days) const
{
	if (_year > days._year)
	{
		return true;
	}
	else if (_year == days._year &&
		_month > days._month)
	{
		return true;
	}
	else if (_year == days._year &&
		_month == days._month &&
		_day > days._day)
	{
		return true;
	}
	return false;
}
//小于
bool Date::operator<(const Date& days) const
{
	return !(*this > days && *this == days);
}
//大于等于
bool Date::operator>=(const Date& days) const
{
	return (*this > days)|| (*this == days);
}
//小于等于
bool Date::operator<=(const Date& days) const
{
	return !(*this > days);
}
//不等于
bool Date::operator!=(const Date& days) const
{
	return !(*this == days);
}

4.3加減法的實現(xiàn)

//判斷一個月的天數(shù)
int GetMonthDay(int _year, int _month)
{
	static int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	if (_month == 2
		&& ((_year % 4 == 0) && (_year % 100 != 0 )|| (_year % 400 == 0)))//判斷閏年
	{
		return 29;
	}
	return monthday[_month];
}	
//日期加一個天數(shù)
Date& Date::operator+=(const int days)
{
	_day += days;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}
//日期加天數(shù),本身不變
Date Date::operator+(const int days)
{
	Date tmp(*this);
	tmp += days;
	return tmp;
}
//日期減天數(shù),本身改變
Date& Date::operator-=(int days)
{
	if (days < _day)
	{
		_day -= days;
		return *this;
	}

	else if (days == _day)
	{
		_month -= 1;
		if (_month == 0)
		{
			_month = 12;
			_year--;
		}
		_day = GetMonthDay(_year, _month);
		return *this;
	}
	else
	{
		days -= _day;
		_month -= 1;
		if (_month == 0)
		{
			_month = 12;
			_year -= 1;
		}
		while (days > GetMonthDay(_year, _month))
		{
			_month -= 1;
			if (_month == 0)
			{
				_month = 12;
				_year -= 1;
			}
		}
		return *this;
	}
	
}
Date Date::operator-(int days)
{
	Date tmp(*this);
	tmp -= 1;
	return tmp;
}
//日期減日期
int  Date::operator-=(Date& days)
{
	//int days = 0;
	if (*this > days)
	{
		if(_day>days._day)
			return _day - days._day;
		else
		{
			return _day + GetMonthDay(_year, _month - 1) - days._day;
		}
	}
	else if (*this == days)
	{
		return 0;
	}
	else
	{
		if (_day < days._day)
			return days._day-_day;
		else
		{
			 return days._day+ GetMonthDay(_year, _month - 1) - _day;
		}
	}

}
//前置日期減減
Date& Date::operator--()
{
	*this -= 1;
	return *this;
}
//后置減減,后置加加需要傳一個int,語法規(guī)定,后置加加也一樣
Date& Date::operator--(int)
{
	Date tmp(*this);
	tmp -= 1;
	return *this;
}
//前置加加
Date& Date::operator++()
{
	*this += 1;
	return *this;
}
//后置加加
Date& Date::operator++(int)
{
	Date tmp(*this);
	tmp += 1;
	return *this;
}

4.4流提取和流插入

//流插入
ostream& operator<<(ostream& out, const Date& date)
{
	out << date._year << "年"
		<< date._month << "月"
		<< date._day << "日"
		<< endl;
	return out;
}
//流提取
ostream& operator>>(istream& in, Date& date)
{
	in >> date._year >> date._month >> date._day;
	return cout<<date;
}

這是運算符重載和重載函數(shù)的實現(xiàn),有興趣的可以自己敲一下。


?文章來源地址http://www.zghlxwxcb.cn/news/detail-458126.html

到了這里,關于運算符重載和重載函數(shù)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C++拷貝構造函數(shù)與賦值運算符重載

    C++拷貝構造函數(shù)與賦值運算符重載

    顧得泉: 個人主頁 個人專欄: 《Linux操作系統(tǒng)》?《C++從入門到精通》??《LeedCode刷題》 鍵盤敲爛,年薪百萬! ???????在現(xiàn)實生活中,可能存在一個與你一樣的自己,我們稱其為雙胞胎。 ???????那在創(chuàng)建對象時,可否創(chuàng)建一個與已存在對象一某一樣的新對象呢? ?

    2024年02月22日
    瀏覽(21)
  • 【C++】:拷貝構造函數(shù)和賦值運算符重載

    【C++】:拷貝構造函數(shù)和賦值運算符重載

    拷貝構造函數(shù)是特殊的構造函數(shù)。 是用一個已經(jīng)存在的對象,賦值拷貝給另一個新創(chuàng)建的已經(jīng)存在的對象 。 本質:用同類型的對象拷貝初始化 。 拷貝構造函數(shù)也是 特殊的成員函數(shù) ,其特征如下: 2.1 拷貝構造函數(shù)是構造函數(shù)的一個重載形式。 2.2 拷貝構造函數(shù)的 函數(shù)名域

    2024年04月28日
    瀏覽(29)
  • kotlin學習(二)泛型、函數(shù)、lambda、擴展、運算符重載

    kotlin學習(二)泛型、函數(shù)、lambda、擴展、運算符重載

    Kotlin 中的類可以有類型參數(shù),與 Java 類似: 創(chuàng)建這樣類的實例只需要提供類型參數(shù)即可: 如果類型參數(shù)可以推斷出來,例如從構造函數(shù)的參數(shù)或者從其他途徑,就可以省略類型參數(shù): String作為Object的子類,就可以直接將子類對象賦值給父類,這個操作即達到了 型變 。 但是

    2024年02月09日
    瀏覽(25)
  • 運算符重載的函數(shù)作為類的成員函數(shù)和友元函數(shù)

    ??博主主頁: @??. 一懷明月?? ????? 專欄系列: 線性代數(shù),C初學者入門訓練,題解C,C的使用文章,「初學」C++ ?? 座右銘: “不要等到什么都沒有了,才下定決心去做” ??????大家覺不錯的話,就懇求大家點點關注,點點小愛心,指點指點?????? 目錄 ??運

    2024年02月08日
    瀏覽(53)
  • 【C++】構造函數(shù),析構函數(shù),拷貝構造,運算符重載,const 成員

    默認成員函數(shù):如果不顯示,編譯器默認生成 構造函數(shù):是一個特殊的 成員函數(shù) ,函數(shù)名與類名相同,專門用于 初始化類對象 函數(shù)名與類名相同 無返回值 ,沒有被聲明為void類型 對象實例化時 編譯器自動調用 , Date d1 ,或 Date d2(2023, 4, 21) 構造函數(shù)可以重載,一個類中可以

    2023年04月24日
    瀏覽(25)
  • 【C++】類和對象(中)---拷貝構造函數(shù)、賦值運算符重載

    【C++】類和對象(中)---拷貝構造函數(shù)、賦值運算符重載

    個人主頁:平行線也會相交?? 歡迎 點贊?? 收藏? 留言? 加關注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學習路線,望對大家有所幫助??? 希望我們一起努力、成長,共同進步。?? 拷貝構造函數(shù),又稱復制構造函數(shù),是一種特殊的

    2024年02月05日
    瀏覽(25)
  • C++ -3- 類和對象 (中) | 拷貝構造函數(shù) & 賦值運算符重載

    C++ -3- 類和對象 (中) | 拷貝構造函數(shù) & 賦值運算符重載

    示例: 拷貝初始化構造函數(shù)的作用是將一個已知對象的數(shù)據(jù)成員值拷貝給正在創(chuàng)建的另一個同類的對象 無窮遞歸 ? Date(Date d){……} 首先,分析 傳值傳參的過程 傳引用傳參 : 沒有拷貝 的過程,直接傳 傳值傳參: 內置類型 編譯器可以直接拷貝(淺拷貝/值拷貝——一個字節(jié)

    2023年04月19日
    瀏覽(27)
  • 【C++】:類和對象(中)之拷貝構造函數(shù)+賦值運算符重載

    【C++】:類和對象(中)之拷貝構造函數(shù)+賦值運算符重載

    在現(xiàn)實生活中,可能存在一個與你一樣的自己,我們稱其為雙胞胎 那在創(chuàng)建對象時,可否創(chuàng)建一個與已存在對象一某一樣的新對象呢? 拷貝構造函數(shù):只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存在的類類型對象創(chuàng)建新對象時由編譯器自動調

    2024年02月06日
    瀏覽(26)
  • 【C++】C++入門—初識構造函數(shù) , 析構函數(shù),拷貝構造函數(shù),賦值運算符重載

    【C++】C++入門—初識構造函數(shù) , 析構函數(shù),拷貝構造函數(shù),賦值運算符重載

    如果一個類中什么成員都沒有,簡稱為空類。 空類中真的什么都沒有嗎? 并不是 任何類在什么都不寫時,編譯器會自動生成以下6個默認成員函數(shù)。 默認成員函數(shù):用戶沒有顯式實現(xiàn),編譯器會生成的成員函數(shù)稱為默認成員函數(shù) 我們實現(xiàn)了,編譯器就不會生成了 構造函數(shù)是

    2024年02月21日
    瀏覽(28)
  • 【C++】類和對象③(類的默認成員函數(shù):拷貝構造函數(shù) | 賦值運算符重載)

    【C++】類和對象③(類的默認成員函數(shù):拷貝構造函數(shù) | 賦值運算符重載)

    ?? 個人主頁: Forcible Bug Maker ?? 專欄: C++ 目錄 前言 拷貝構造函數(shù) 概念 拷貝構造函數(shù)的特性及用法 賦值運算符重載 運算符重載 賦值運算符重載 結語 本篇主要內容:類的6個默認成員函數(shù)中的 拷貝構造函數(shù) 和 賦值運算符重載 在上篇文章中我們講到了類的默認成員函數(shù)的

    2024年04月17日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包