成員函式和運算子的過載
一、建構函式的過載
建構函式可以過載,使得生成例項時非常方便。建構函式一般要對成員變數賦初值,有2種寫法:
寫法一是在建構函式體中賦值,賦值前成員變數已經有了位址空間,尚未有值。寫法二是一種特殊方法,是在成員變數分配空間的同時將引數的值賦給成員變數。雖然寫法二用的人少,但明顯優於寫法一。#include
#include
using namespace
std;class
stuffstuff(string n,
int
a):name(n),age(a)//這是寫法二string getname()
int
getage()};
int
main ( )
事實上,如果將成員變數的定義改為常量,「const string name;」和「const int age;」,寫法一將出錯,而寫法二仍然正確。
二、運算子過載
運算子過載對於普通函式和成員函式來說,格式稍有不同。
//單目運算子成員函式: 返回值型別
operator
運算子 () ;普通函式: 返回值型別
operator
運算子 (物件的型別) ;//雙目運算子
成員函式: 返回值型別
operator
運算子 (物件的型別) ;普通函式: 返回值型別
operator
運算子 (物件的型別1, 物件的型別2) ;//函式呼叫
成員函式: 返回值型別
operator
(任意的引數列) ;//陣列元素
成員函式: 返回值型別
operator
(引數型別) ;//增1/減1運算子
成員函式: 返回值型別
operator
運算子 (int) ;普通函式: 返回值型別
operator
運算子 (物件的型別, int) ;
三、拷貝建構函式和賦值運算子#include
#include
using namespace
std;class
stuffstring getname()
int
getage()void
operator +(int
x); //運算子過載的定義void
operator +(string s); //運算子過載的定義};
void
stuff::operator +(int
x) //運算子過載的實裝
void
stuff::operator +(string s) //運算子過載的實裝
int
main ( )
本節內容較深,初學者請跳過。「拷貝建構函式」和「賦值運算子」都是將物件的值複製乙份然後傳給另一物件。這二個功能也是類本身就具有的,但有很多場合原封不動地複製給另外乙個物件時反而會出錯,例如在成員函式中有動態分配記憶體,或者引數指標指向外部某一位址時,就有可能出錯。
要避免這些錯誤,我們可以過載「=」運算子以及拷貝建構函式,將出錯的因素排除。下例中為了演示,故意將賦值運算子過載函式中不複製「姓名」,而拷貝建構函式中固定「年齡」。
四、型別轉換#include
#include
using namespace
std;class
stuffstring getname()
int
getage()stuff&
operator
=(stuff& x); //賦值運算子過載stuff(stuff& x):name(x.name),age(20) //拷貝建構函式過載
};stuff& stuff::
operator
=(stuff& x)
int
main ( )
當需要將當前類的例項直接賦值給其它型別的變數時自動轉換型別,這其實還是運算子過載。當需要其它型別直接賦值給當前類的例項時,只要增加建構函式就行。
#include
#include
using namespace
std;class
stuffstring getname()
int
getage()operator
int
()operator
string()};
int
main ( )
運算子過載 成員函式
檔名稱 test.cpp 完成日期 2016年5月14日 問題描述 請用類的成員函式,定義複數類過載運算子 使之能用於複數的加減乘 include using namespace std class complex complex double r,double i complex operator...
C 運算子過載函式之成員運算子過載函式
5.2.3 成員運算子過載函式 在c 中可以把運算子過載函式定義為某個類的成員函式,稱之為成員運算子過載函式。1.定義成員運算子過載函式的語法形式 1 在類的內部,定義成員運算子過載函式的格式如下 函式型別 operator 運算子 形參表 2 成員運算子過載函式也可以在類中宣告成員函式的原型,在類...
運算子過載,const成員函式
1.運算子過載 c 為了增強 的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值類 型,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。乙個賦值運算子過載的例子 include includeusing namespace std class mystr mys...