類,運算子過載,this指標
阿新 • • 發佈:2019-02-19
class Complex
{
private :
double m_real;
double m_imag;
public:
// 無引數建構函式
// 如果建立一個類你沒有寫任何建構函式,則系統會自動生成預設的無參建構函式,函式為空,什麼都不做
// 只要你寫了一個下面的某一種建構函式,系統就不會再自動生成這樣一個預設的建構函式,如果希望有一個這樣的無參建構函式,則需要自己顯示地寫出來
Complex(void)
{
m_real = 0.0;
m_imag = 0.0;
}
// 一般建構函式(也稱過載建構函式)
// 一般建構函式可以有各種引數形式,一個類可以有多個一般建構函式,前提是引數的個數或者型別不同(基於c++的過載函式原理)
// 例如:你還可以寫一個 Complex( int num)的構造函數出來
// 建立物件時根據傳入的引數不同調用不同的建構函式
Complex(double real, double imag)
{
m_real = real;
m_imag = imag;
}
// 複製建構函式(也稱為拷貝建構函式)
// 複製建構函式引數為類物件本身的引用,用於根據一個已存在的物件複製出一個新的該類的物件,一般在函式中會將已存在物件的資料成員的值複製一份到新建立的物件中
// 若沒有顯示的寫複製建構函式,則系統會預設建立一個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險,具體原因請查詢有關 “淺拷貝” 、“深拷貝”的文章論述
Complex(const Complex & c)
{
// 將物件c中的資料成員值複製過來
m_real = c.m_real;
m_img = c.m_img;
}
// 型別轉換建構函式,根據一個指定的型別的物件建立一個本類的物件
// 例如:下面將根據一個double型別的物件建立了一個Complex物件
Complex::Complex(double r)
{
m_real = r;
m_imag = 0.0;
}
// 等號運算子過載
// 注意,這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立
// 若沒有顯示的寫=運算子過載,則系統也會建立一個預設的=運算子過載,只做一些基本的拷貝工作
Complex &operator=(const Complex &rhs)
{
// 首先檢測等號右邊的是否就是左邊的物件本,若是本物件本身,則直接返回
if ( this == &rhs )
{
return *this;
}
// 複製等號右邊的成員到左邊的物件中
this->m_real = rhs.m_real;
this->m_imag = rhs.m_imag;
// 把等號左邊的物件再次傳出
// 目的是為了支援連等 eg: a=b=c 系統首先執行 b=c
// 然後執行 a= ( b=c的返回值,這裡應該是複製c值後的b物件)
return *this;
}
};
a->b的含義是(*a).b
通過this指標來訪問自己的地址。
注:this指標並不是物件的一部分,this指標所佔的記憶體大小是不會反應在sizeof操作符上的。
C++預定義中的運算子的操作物件只侷限於基本的內建資料型別,但是對於我們自定義的型別(類)是沒有辦法操作的。但是大多時候我們需要對我們定義的型別進行類似的運算,這個時候就需要我們對這麼運算子進行重新定義,賦予其新的功能,以滿足自身的需求。
C++運算子過載的實質:
運算子過載的實質就是函式過載或函式多型。運算子過載是一種形式的C++多型。目的在於讓人能夠用同名的函式來完成不同的基本操作。要過載運算子,需要使用被稱為運算子函式的特殊函式形式,運算子函式形式:operatorp(argument-list)//operator 後面的’p’為要過載的運算子符號。
參考資料:http://blog.csdn.net/lishuzhai/article/details/50781753