運算符重載典型問題——對象自增實現成員變量自增且對象間賦值

operator C++的關鍵字,本質上operator++() 與普通重載函數相同,不同的是C++專門爲這個特殊的重載函數定義了各種基本數據類型,因此我們可以不去管理數據的類型,只需在用的時候填好所要進行運算的數據就可以了。

定義方式:  void operator ++(){++num}   功能:簡化對象對應的的成員變量的自加操作,把本應通過設置一個成員函數完成對成員變量的自加操作化簡爲直接對變量的自加操作。

如,給apple類實現自加操作。

I在沒有使用運算符重載的原始代碼:

#include<iostream>
using std::cout;
using std::endl;
class apple
{
	private:
	int num;
	public:
	apple(){num = 1;}
	~apple(){}
	int get() const
	{
		return num;
	}
	void add(void)
	{
		++num;
	}
};
int main(int argc, char const *argv[])
{
	apple i;
	cout<<"i:"<<i.get()<<endl;
	i.add();
	cout<<"i:"<<i.get()<<endl;
	return 0;
}


II.使用運算符重載後的代碼:

#include<iostream>
using std::cout;
using std::endl;
class apple
{
	private:
	int num;
	public:
	apple(){num = 1;}
	~apple(){}
	int get() const
	{
		return num;
	}
	void operator ++(void)
	{
		++num;
	}
};
int main(int argc, char const *argv[])
{
	apple i;
	cout<<"i:"<<i.get()<<endl;
	++i;  //對 對象進行自增  等同於上一段代碼 用成員函數來自增
	cout<<"i:"<<i.get()<<endl;
	return 0;
}


III.利用重載運算符創建臨時對象,使主函數中自加後的對象賦給另外一個對象:

#include<iostream>
using std::cout;
using std::endl;
class apple
{
	private:
	int num;
	public:
	apple(){num = 1;}
	~apple(){}
	int get() const
	{
		return num;
	}
	void set(int x){num = x;}
	apple operator ++(void)
	{
		++num;
		apple temp;
		temp.set(num);
		return temp;
	}
};
int main(int argc, char const *argv[])
{
	apple i;
	cout<<"i:"<<i.get()<<endl;
	apple j = ++i;  
	cout<<"i:"<<i.get()<<endl;
	cout<<"j:"<<j.get()<<endl;
	return 0;
}


IV.利用帶參數的構造函數與重載運算符創建無名臨時對象,使主函數中自加後的對象賦給另外一個對象:

#include<iostream>
using std::cout;
using std::endl;
class apple
{
	private:
	int num;
	public:
	apple(){num = 1;}
	apple(int x){num = x;}
	~apple(){}
	int get() const
	{
		return num;
	}
	void set(int x){num = x;}
	apple operator ++(void)
	{
		++num;
		return apple(num);//利用帶參數的構造函數代替了上一段代碼的臨時對象 
	}
};
int main(int argc, char const *argv[])
{
	apple i;
	cout<<"i:"<<i.get()<<endl;
	apple j = ++i;  
	cout<<"i:"<<i.get()<<endl;
	cout<<"j:"<<j.get()<<endl;
	return 0;
}

V.不需創建臨時對象完成對象自增後再賦值給另一個對象:

#include<iostream>
using std::cout;
using std::endl;
class apple
{
	private:
	int num;
	public:
	apple(){num = 1;}
	apple(apple const &s){this->num = s.num;}
	~apple(){}
	int get() const
	{
		return num;
	}
	void set(int x){num = x;}
	apple operator ++(void)
	{
		++num;
		return *this;//this指針指向對象本身,此句相當於返回對象 
	}
};
int main(int argc, char const *argv[])
{
	apple i;
	cout<<"i:"<<i.get()<<endl;
	apple j = ++i;  //把自增完成後的i賦值給j,相當於把i傳遞給構造函數apple(apple const &s)當形參形參,使i完成對j的賦值 
	cout<<"i:"<<i.get()<<endl;
	cout<<"j:"<<j.get()<<endl;
	return 0;
}



發佈了13 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章