類的靜態成員(用static聲明的成員),在聲明之外用例單獨的語句進行初始化,初始化時,不再需要用static進行限定。在方法文件中初始化。以防重復。
特殊成員函數
復制構造函數: ??????
????????當使用一個對象來初始化另一個對象時,編譯器將自動創建一個復制構造函數。
????????對于復制構造函數,用于將一個對象復制到新創建的對象中,需要知道2點:何時調用,有何作用。
????????復制構造函數原型:
????????隱式復制構造函數是按值傳遞進行復制的,復制的時候是淺復制。因此,如果有用new創建成員時,不能使用隱式復制構造函數,要定義一個顯示的復制構造函數。處理new開辟的存儲空間,不然后導致異常,復制的數據也不是真的數據,只是復制了地址。定義復制構造函數可以執行深度復制。
賦值運算符重載
??????? c++給類對象賦值,因為自動為類重載了賦值運算符,當然,自動的用起來不會很好用,不一定就能滿足自己的需求,如果不知道自動定義的做了啥,就很難判斷是否需要自己重新定義一個。
??????? 用一個對象賦給一個新對象進行賦值時,不一定會調用賦值運算符,也可能直接用復制構造函數實現。
??????? 和隱匿構造函數一樣,隱式賦值構造函數也只是淺復制,不要復制指針指向的數據。導致數據受損。因此,如果有一些指針成員,就要自定義賦值運算符,來避免淺復制,執行深度復制才能避免異常。
??????? 賦值運算符原型:
??????? 延伸:執行賦值的時候,要意識到,新對象其實已通過構造函數創建好的對象,再執行賦值的,因此,如果構造函數通過new開辟了空間,賦值時,要先delete釋放這個已開辟的空間。不能延用,為啥?因為你不知道原空間有多大,夠不夠用,不如直接釋放,再重新開辟一個新的更安全。
??????? 空指針:nullptr
? 靜態類成員函數 ????
??????? 靜態類成員函數,聲名在公有部分,定義時,在前面加static關鍵字,使用的時候,用類名::函數名。
??????? 靜態成員函數只能訪問靜態成員。。
小結:
??????? 在構造函數用使用了new時要注意
??????? 1、析構函數中要使用delete釋放內存
??????? 2、new和delete要對應,數組還是單個的。new[]和delete[].
??????? 3、如果有多個構造函數,那個用new的方式對一致,要么都是new,要么都是new[]。不然析構的時候要混亂。
??????? 4、定義一個復制構造函數,執行深度復制,避免混亂。
??????? 5、重載賦值運算符,執行深度復制,避免混亂。
返回對象的說明
??????? 返回指向const對象的引用,??????? 返回指向對象的引用,??????? 返回const對象。
??????? 返回對象將調用復制函數,沒有返回引用的效率高。
??????? 至于用哪種,有些是效率考慮,有些是因為輸入參數或其它原因,只能選某一種。
??????? 一般來講,如果返回的是局部對象,就一定要返回對象。如果返回一個沒有公有復制構造函數的類(如ostream類)的對象,就一定要反加引用類型。其它的可以返回對象,也可以返回引用的,優先返回引用,效率高一些。
??????? 類在聲明時可以初始化,與成員初始化列表等價。