1. 程式人生 > >c++運算符重載以及一些基本概念

c++運算符重載以及一些基本概念

不同類 col end 錯誤 pan [] () 無限 c++對象

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++運算符重載以及一些基本概念