標籤:友元 算術 成員 分配 對象產生 虛函數 運行 編譯器 typeid
c++primer第四版435
1.賦值( = ), 下標( [ ] ) ,調用 ( ( ) ), 成員訪問箭頭 (->)等操作符必須定義為成員,定義為非成員時,編譯器報錯
2. 像賦值一樣。符合賦值操作符通常應定義為類的成員,可是定義為非成員的複合賦值操作符時不會出現編譯錯誤
3.改變對象狀態或給定類型緊密聯絡的其它一些操作符,如自增,自減和解引用,通常應定義為類的成員
4.對稱操作,如算術操作符,相等操作符,關係操作符和位操作符。最好定義為普通的非成員函數
不能重載的操作符:
:: .* . ? :
基本注意問題:
1.成員變數的初始化順序僅僅與在聲明時的順序一樣,和初始化列表中的順序無關2.必須在初始化列表中初始化的情況: 沒有預設建構函式的類類型的成員 const類型成員 和 參考型別的成員變數 -->const 類型成員會調用拷貝建構函式 而參考型別不會調用拷貝建構函式class B;class A{ friend class B; public: A() { a_ = 0; cout << "A()" << endl; } A(int a):a_(a) { cout << "A(int)" << endl; } A(const A &s) { a_ = s.a_; cout << "A &" << endl; } private: int a_;};class B : public A{ public: B(A &a2, A &a3) :a2_(a2), a3_(a3) { } void prin() { cout << a2_.a_ << " " << endl; } private: // A a1_; A &a2_; const A a3_;};int main(int argc, const char *argv[]){ A a1(4), a2(5), a3(6); //--> A(int) A(int) A(int) B b(a2, a3); b.prin(); return 0;}-->友元類,能訪問到A類的私人成員
3.c++的兩種初始化方式:1.直接初始化:調用建構函式 2.複製初始化:使用=號操作符,會調用到拷貝建構函式4.當函數形參或者傳回值為類類型時,將由複製建構函式進行複製 A a1;fun(A ); --->調用fun(a)會調用拷貝建構函式,當然最後也會調用解構函式的5.拷貝建構函式為引用的原因:防止無限調用拷貝建構函式下去。拷貝建構函式傳形參值時會調用類型的拷貝建構函式,這樣無窮下去6.深拷貝 淺拷貝 :淺拷貝:對資料成員進行簡單的賦值 深拷貝:對於對象中的動態成員,不能簡單的賦值,而應該又一次動態分配空間7.空間 C++對象:先調用基類建構函式,在初始化列表上成員,再調用自己的建構函式 -->析構的時候反過來8. 重載 覆蓋 隱藏的概念9. 轉換建構函式和類型 轉換函式的差別。 類型轉換函式注意的幾點:1.成員函數, 2.不能指定傳回型別, 3.不能有參數 -->operator int() -->函數裡面要return 一個同樣類型的出來10.多態性:靜態多態性(重載(操作符。 函數)) 動態多態性:虛函數11.:使用指標訪問非虛函數:訪問指標的類型的, 使用指標訪問虛函數時:訪問指標所指對象的類型 ---> 引用也是類似的,只是引用一經聲明不能改變了12.觸發動態綁定的條件:1.虛函數才幹運行動態綁定 2.必須通過基類類型的指標或者引用進行函數調用13.建構函式不能為虛函數:虛函數實在不同類型的對象產生不同的動作,如今對象還沒產生,沒有虛函數指標。訪問不到虛函數。
13.動態執行時類型識別(RTTI):typeid 返回指標或者引用所指對象的實際類型 dynamic_cast 將基類的指標或引用安全的轉換成衍生類別型的指標或引用14.顯式轉換:reinterpret_cast 強制類型轉換-- >類似於c的類型轉換 const_cast 轉換掉const屬性或者加上const屬性 static_cast 隱式類型轉換,能夠自己主動轉換的 dynamic_cast 主要用於有虛函數的下行轉換
??
c++運算子多載以及一些基本概念