運算子過載筆記

嘰了咣啷biang發表於2012-07-07

建立臨時物件

將自加後的物件賦給另一個物件,我們需要建立一個臨時物件,然後返回該物件

 

#include <iostream>
using namespace std;
class num
{
public:
	num(){n=1;}
	~num(){}
	int get()const{return n;}
	void set(int x){n=x;}
	num operator++()
	{
		++n;
		num t;                  //臨時物件t
		t.set();
		return t;
	}
private:
	int n;
};
int main()
{
	return 0;
}

 

建立無名臨時物件


要想實現以上功能也可以不用建立一個臨時物件,假如我們有一個帶引數的建構函式,那麼我們只要這個建構函式返回即可。

#include <iostream>
using namespace std;
class num
{
public:
	num(){n=1;}
	num(int i){n=i;}
	~num(){}
	int get()const{return n;}
	void set(int x){n=x;}
	num operator++()
	{
		++n;
		return num(n);
	}
private:
	int n;
};
int main()
{
	return 0;
}

 

取消建立臨時物件

建立一個物件將會呼叫建構函式,來為該物件開闢記憶體空間,而銷燬該物件則要呼叫解構函式來釋放記憶體,每建立一次物件,系統都要犧牲一定的速度和記憶體空間,this指標就是當前物件的標籤,而當前物件的成員變數也會被編譯器自動貼上this標籤以證明是當前物件的,那麼只要將當前物件的成員變數自己,然後返回this指標指向的當前物件即可。


 

#include <iostream>
using namespace std;
class num
{
public:
	num(){n=1;}
	num(int i){n=i;}
	num(const num &s){this->n=s.n;} //為了避免按值返回建立一個*this的臨時副本,我們最好把operator的返回值定義為按別名返回,
	~num(){}                        //並且我們不可能只想能夠++++i這樣的操作,,既將i進行前置自加後再進行自加,因此我們有必要將它的返回值也
	int get()const{return n;}       //定義為常量如:
	void set(int x){n=x;}
	num operator++()                //const num &operator(){}
	{
		++n;
		return *this;
	}
private:
	int n;
};
int main()
{
	return 0;
}


 

以上過載的是前置自加運算子,下面過載一下後置運算子。

#include <iostream>
using namespace std;
class num
{
public:
	num(){n=1;}
	num(int i){n=i;}
	num(const num &s){this->n=s.n;}
	~num(){}
	int get()const{return n;}
	void set(int x){n=x;}
	const num &operator++()               //前置自加
	{
		++n;
		return *this;            
	}
	const num operator++(int o)          //後置自加         int o引數沒有任何實際意義,只是區分與前面的前置自加過載的區分。           
	{
		num temp(*this);            //利用先把未自加的值賦給臨時物件,然後自加值,然後返回臨時物件。由於臨時物件一旦呼叫完就會成為
		++n;                        //找出作用域的空引用,所以不能按別名返回,得用按值返回。
		return temp;
	}
private:
	int n;
};
int main()
{
	return 0;
}

相關文章