C++中容易忽略的知識
阿新 • • 發佈:2019-02-01
- const成員不能改變其所操作的物件的資料成員。const必須同時出現在宣告和定義中,若只在定義或者宣告中出現一處,就會出現編譯錯誤。
- 不能從const成員函式返回指向類物件的普通引用,const成員只能返回*this作為一個const引用。
- 顯式指定inline成員時,可以在類內宣告時寫inline,也可在類外寫inline,但是隻能二者選一。
- 因為類可以向前宣告,即只是宣告,如:class A;卻不定義類的成員,所以該類不能建立物件。但是可以定義該類的指標或者引用。這樣便可以定義一個class A{ public:A *next;};類似C語言中連結串列所表示的結構一樣。
- 使用類的方法有兩種:一種為A temp;另一種為class A temp;。這是為了和C語言的結構體相容。
- const物件只能使用const成員。非const物件可以使用任意成員。
- Mutable表示可變資料成員,甚至當它是const物件也是如此。將資料成員前加上mutable關鍵字,const成員函式就可以改變該成員變數的值了。
- 成員函式形參表和函式體處於類作用域中,這兩個可以直接使用類內定義的型別或者變數。函式的返回值型別不一定在類作用域中,與形參表相比,返回值型別出現在成員函式名字前面。如果函式定義在類定義體外,則用於返回值型別的名字在類作用域之外。如果返回值型別使用類定義的型別,則必須使用完全限定名。而形參表和成員函式體都出現在成員名之後,這些都是淚的作用域中定義,所以不用限定而使用其他成員。如:
class Screen{ public: Typedef std::string::size_type index; Index get_cursor() const; private: Int cursor; }; Inline Screen::index Screen::get_cursor()const{ return cursor; }
-
一旦一個名字被用作型別名,該名字就不能被重複定義。建構函式不能宣告為const,因為這完全沒有意義,建構函式的性質就是要給資料成員進行賦值的。
- 建構函式可以用初始化列表或函式體內賦值進行初始化。但賦值並不是顯式的初始化,而是建構函式執行時先對資料成員進行預設初始化,然後再賦值覆蓋。從概念上講,可以認為建構函式分為兩個階段執行:初始化階段;普通計算階段。計算階段由建構函式函式體中的語句組成。不管資料成員是否在建構函式初始化列表中顯式初始化,類型別的資料成員總是在初始化階段進行初始化。初始化發生在計算階段之前。
- 根據上述規定,可以得出:有些成員必須在建構函式初始化列表中進行初始化。對於這樣的成員,在建構函式體重對它們初始化不起作用。沒有預設建構函式的類型別的成員,const或者引用型別成員必須在建構函式初始化列表中進行初始化,而不能在建構函式函式體中進行賦值初始化。
- 資料成員初始化的順序和資料成員宣告的順序一致,而不是根據建構函式的初始化列表的順序一致。
- 只要定義一個物件時沒用提供初始化式,就使用了該類的預設建構函式。如:A a;使用的是預設建構函式,而A a(37);表示使用了其他建構函式。
- 只有類沒有定義建構函式時,編譯器才會自動生成一個預設建構函式。
- 單個實參呼叫的建構函式定義了從形參型別到該類型別的一個隱式轉換。如:
class Sales_item{ public: sales_item(const std::string &book=””):isbn(book),unit(0),revenue(0.0){} void same_isbn(Sales_item si); }; //當使用物件呼叫 Sales_item item; Item.same_isbn(“123556”); //就會呼叫sales_item的單形參的建構函式例項化一個新物件,然後傳給same_isbn做實參。從而實現隱式轉換。若要避免隱式轉換,就要在建構函式宣告前加上expl//icit,explicit用於類內部的建構函式宣告上,在類定義體外部不再重複。
- 友元只能出現在類定義的內部。
- 當我們在類外部定義static成員時,無需重複指定static保留字,該保留字只出現在類定義體內部宣告處。static成員函式不能被宣告為const,因為const就是承諾不會修改該函式所屬物件的資料成員,但是static 不屬於任何物件,static不能宣告為虛擬函式。static成員可以通過作用域操作符,物件,引用或指向該類型別的物件的指標呼叫。
- static成員函式沒有this形參,它可以直接訪問所屬類的static成員,但不能直接使用非static成員。
- 當static成員在類外部定義時,static只寫在類定義體內部的宣告處。
- static資料成員只能定義在類定義體外部,並且進行初始化,static只能在宣告處標識。因為普通資料成員不能在類的定義體中初始化,但static成員定義時必須初始化,所以只能定義在定義體外部。
- const static資料成員可以在類定義體內部進行初始化,但是資料成員必須在類定義體外部進行定義。只是在類內部初始化時,資料成員的定義不再指定初始值。
- static資料成員可以做預設實參,其他資料成員不可以。
- static資料成員的型別可以是該類成員所屬的型別,如:
class Bar{ public: private: static Bar men1;//ok Bar * men2;//ok Bar men3;//error };