1. 程式人生 > >C++ Primer筆記12_運算符重載_遞增遞減運算符_成員訪問運算符

C++ Primer筆記12_運算符重載_遞增遞減運算符_成員訪問運算符

primer -a rime scott ipp 變量 函數 ott 解決

1.遞增遞減運算符

C++語言並不要求遞增遞減運算符必須是類的成員。可是由於他們改變的正好是所操作對象的狀態。所以建議設定為成員函數

對於遞增與遞減運算符來說,有前置與後置兩個版本號,因此。我們應該為類定義兩個版本號的遞增與遞減運算符。


問題來了。程序是怎樣區分前置和後置呢?由於都是++和-- 為了解決問題,後置版本號的遞增遞減運算符接受一個額外的(不被使用)int類型的形參。當我們使用後置運算符時,編譯器為這個形參提供一個值為0的實參。

這個形參唯一的作用就是區分前置和後置運算符函數。

由於不會用到int形參,所以無須為其命名。

樣例例如以下:

Person & Person::operator++()//前置版本號的++
{
	age++;//only ++ age
	return *this;
}

Person & Person::operator--()//前置版本號的--
{
	age--;
	return *this;
}

Person & Person::operator++(int)//後置版本號的++
{
	Person &p = *this;
	age++;
	return p;
}

Person & Person::operator--(int)//後置版本號的--
{
	Person &p = *this;
	age--;
	return p;
}
int main()
{
	Person p1(20, "SCOTT");
	Person p2(10, "Kate");
	cout << p1 << endl;
	p1--;
	cout << p1 << endl;
	
	return 0;
}

上述代碼比較簡單,為了方便演示。在我們的Person中僅僅對Person類中的age成員變量進行了遞增遞減操作。


執行結果:

Init Person
Init Person
p.age: 20, p.name: SCOTT
p.age: 19, p.name: SCOTT
~Person name: 0x8dcc048 age: 10
~Person name: 0x8dcc020 age: 19


2.成員訪問運算符

在叠代器類以及智能指針類中經常見到解引用運算符(*) 與 箭頭運算符(->) 。

我們也能夠自己定義這兩個運算符。


樣例:

Person * Person::operator->()
{
	return this;
}
Person & Person::operator*()
{
	return *this;
}
int main()
{
	Person p1(20, "SCOTT");
	Person p2(10, "Kate");

	cout << p1->getName() << endl;
	cout << (*p2).getName() << endl;
	
	return 0;
}
執行結果:

Init Person
Init Person
SCOTT
Kate

~Person name: 0x89d7048 age: 10
~Person name: 0x89d7020 age: 20


C++ Primer筆記12_運算符重載_遞增遞減運算符_成員訪問運算符