1. 程式人生 > >類中的四個預設成員函式+運算子過載

類中的四個預設成員函式+運算子過載

1:整理類和物件的基礎知識,如類的定義,訪問限定符,面向物件封裝性,物件的大小計算等等。 
類 = 成員物件+成員方法,成員物件 = 資料,成員方法 = 函式,函式可以在類外部定義,類中宣告使用。
訪問限定符 :①public ②private ③protect 
public: 可以從外部訪問類中的成員物件和成員方法。
private,protect:成員不能從類外部直接訪問。
沒有限定符,預設為私有。類的限定符體現了面向物件的封裝型。
面向物件封裝型:該公開的就公開話,該私有的就隱藏掉,主要是由public,private實現;作用是便於分工和分模組,防止不必要的擴充套件;
物件的大小計算:和結構體計算大小相同,也要遵循對齊規則。對齊規則,空間換取時間,提高效率。
類中沒有成員時,vs預設大小為1,佔位。
2:整理四個預設成員函式及運算子過載相關知識 


一: 建構函式:
1:函式名和類名相同
2:無返回值
3:物件構造(建立物件)時系統自動呼叫建構函式
Data D1(1,2,3);
4:可過載
5:可在類中定義,也可在類外定義,類中呼叫。
6:如果類中沒有給出建構函式,c++編譯器系統自動給一個預設建構函式,但只要構造了一個建構函式,編譯器就不會再給。
7:無參的函式和全預設的建構函式都認為是預設建構函式,預設建構函式類中只能存在一個,不然衝突,
                        Data(int year = 2017,int month = 7,int day = 10)
{
}
Data()
{
}


二:拷貝建構函式:建立物件時同類初始化
1:拷貝建構函式其實是建構函式的過載
2:拷貝建構函式的引數必須是引用,如果用形參會導致無限遞迴,
比如:Data d2(Data d1);因為d1是形參,在建立形參過程中,需要呼叫拷貝建構函式,這樣會繼續這樣,無限遞迴,因此使用拷貝建構函式是傳參需要是引用。
3:類中如果沒有定義拷貝建構函式,系統會預設預設的拷貝建構函式。


三:解構函式:完成清理,(動態開闢的free,呼叫檔案時的close)
1:解構函式名稱是在類明的前面加上~,比如 class AA,解構函式名就是~AA();
2:沒有返回值;
3:一個類有且只有一個解構函式;若類中沒有定義,系統會自動生成預設的建構函式;
4:物件生命週期結束時,c++編譯器系統會自動呼叫;
5:注意解構函式不是刪除物件,而是做一些清理工作;
注:運算子過載:為了增強程式可讀性,c++支援過載
      五個不能過載的運算子:①.*   ②::  ③sizeof  ④?:(三目運算子) ⑤.


四:賦值運算子過載:多次操作運算子
1:賦值運算子過載是對一個已存在的物件進行拷貝賦值;
2:operator+合法的運算子    構成函式名
3:運算子的過載不改變運算子的優先性


3:整理隱含的this指標等等,及對運算子過載背後做的事情。
this指標:一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。
同一個類的不同物件,呼叫類中函式時,看起來是d1.display();
d2.display();其實有隱含的this指標,d1.display(&d1);d2.display(&d2);
賦值運算子過載後邊的this指標用法:
Data d1,d2,d3;
d1 = d2 = d3;
實際就是d1.operator = (d2.operator = d3);
d2.operator = d3;也就是data& operator=(this,const data& d3);只不過這個this是預設隱含的。