C++ Primer 有感(类)
1.在類內部,聲明成員函數時必需 的,而定義成員函數則是可選的。在類內部定義的函數默認為inline。
?
2.const成員函數不能改變其所操作的對象的數據成員。const必須同時出現在聲明和定義中,若只出現其中一處,就會出現一個編譯時錯誤。
?
3.顯示指定inline成員函數
在類內部定義的成員函數默認是inline。顯示指定inline成員函數的辦法有3種:
(1)類定義體內部指定inline,作為其聲明的一部分。
(2)類定義體外部的函數定義上inline
(3)類定義體內和外均指定為inline
注意:inline成員函數的定義必須在調用該函數的每個源文件中時可見的。不在類定義體內定義的inline成員函數,其定義通常用放在有類定義的同一頭文件中。
?
4.在一個給定的源文件中,一個類只能被定義一次。如果在多個文件中定義一個類,那么每個文件中的定義必須是完全相同的。
?
5.在聲明之后、定義之前的類是一個不完全的類型。不完全類型只能以有限的方式使用。不能定義該類型的對象。不完全類型只能用于定義指向該類型的指針及引用,或者用于聲明(而不是定義)使用該類型的作為形參類型或者返回類型的函數。
?
6.定義對象時,將為其分配存儲空間,但(一般而言)定義類型時不進行存儲分配。
?
7.在普通的非const成員函數中,this的類型是一個指向類類型的const指針,可以改變this所指向的值,但不能改變this所保存的地址。在const成員函數中,this的類型時一個指向const類類型對象的const指針。既不能改變this所指向的對象,也不能改變this所保存的地址。
?
8.不能從const成員函數返回指向類對象的普通引用。const成員函數只能返回*this作為一個const引用。
?
9.如果函數在類定義體之外定義,則用于返回類型的名字在類作用域之外。如果返回類型使用由類定義的類型,則必須使用完全限定名。
例如:
class Screen {public:typedefstd::string::size_type index;index get_cursor() const; };inline Screen::index Screen::get_cursor() const {return cursor; }該函數的返回類型時index,這是在Screen類內部定義的一個類型名。
?
10.當成員定義在類定義的外部時,要考慮在成員函數定義之前出現的全局作用域聲明。
class Screen {public:// ....void setHeight(index);private:indexheight; }; Screen::index verify(Screen::index);void Screen::setHeight(index var) {height =verify(var); }注意:全局函數verify的聲明在Screen類定義之前是不可見的。然而名字查找可以考慮那些出現在成員函數定義之前的外圍作用域聲明,并找到全局函數verify的聲明。
?
11.從概念上講,可以認為構造函數分兩個階段執行:(1)初始化階段;(2)普通的計算階段。計算階段由構造函數函數體中的語句組成。
?? ?不管成員是否在構造函數初始化列表中顯示初始化,類類型的數據成員總是在初始化階段初始化。初始化發生在計算階段開始之前。
?? ?在構造函數初始化列表中沒有顯示提及的每個成員,使用與初始化變量相同的規則來進行初始化。運行該類型的默認構造函數,來初始化類類型的數據成員。內置或復合類型的成員的初始值依賴于對象的作用域:在局部作用域中這些成員不被初始化,而在全局作用域中他們被初始化為0。
例如:
Sales_item::Sales_item(const string &book) {isbn = book;units_sold = 0;revenue = 0.0; }? ? 這個構造函數給類Sales_item的成員賦值,但沒有進行顯示初始化。不管是否有顯示的初始化式,在執行構造函數之前,要初始化isbn成員。這個構造函數隱式使用默認的string構造函數初始化isbn。執行構造函數的函數體時,isbn成員已經有值了。該值被構造函數函數體中的賦值所覆蓋。
12.有些成員必須在構造函數初始化列表中進行初始化。對于這樣的成員,在構造函數函數體中對它們賦值不起作用。
(1)沒有構造函數的類類型的成員。
(2)const 成員。
(3)引用類型的成員。
?
13.只有當一個類沒有定義構造函數時,編譯器才會自動生成一個默認構造函數。
?
14.合成的默認構造函數使用與變量初始化相同的規則來初始化成員。具有類類型的成員通過運行各自的默認構造函數來進行初始化。內置和復合類型的成員,如指針和數組,只對定義在全局作用域中的對象才初始化。當對象定義在局部作用域中時,內置或復合類型的成員不進行初始化。
? ? 如果類包含內置或復合類型的成員,則該類不應該依賴于合成的默認構造函數。它應該定義自己的構造函數來初始化這些成員。
?
15.explicit關鍵字只能用于類內部的構造函數聲明上。在類的定義體外部所做的定義上不再重復它。
? ? ?通常,除非有明顯的理由想要定義隱式轉換,否則,單形參構造函數應該為explicit。將構造函數設置為explicit可以避免錯誤,并且當轉換有用時,用戶可以顯示的構造對象。
?
16.友元機制允許一個類將對其非公有成員的訪問權授予指定的函數或類。友元的聲明以關鍵字friend開始。它只能出現在類定義的內部。
?
17.友元可以是普通的非成員函數,或前面定義的其他類的成員函數,或整個類。將一個類設為友元,友元類的所有成員函數都可以訪問授予友元關系的那個類的非公有成員。當我們將成員函數聲明為友元時,函數名必須用該函數所屬的類名字加以限定。
注意:必須先定義包含成員函數的類,才能將成員函數設為友元。
?
18.非static數據成員存在于類類型的每個對象中。不像普通的數據成員,static數據成員獨立于該類的任意對象而存在;每個static數據成員是與類關聯的對象,并不與該類的對象關聯。static成員函數沒有this形參,它可以直接訪問所屬類的static成員,但不能直接使用非static成員。
?
19.可以通過作用域操作符從類直接調用static成員,或者通過對象、引用或指向該類類型對象的指針間接調用。
?
20.當我們在類的外部定義static成員時,無須重復指定static保留字,該保留字只出現在類定義體內部的聲明處。
?
21.因為static成員不是任何對象的組成部分,所以static成員函數不能被聲明為const,畢竟,將成員函數聲明為const就是承諾不會修改該函數所屬的對象。static成員函數也不能聲明為虛函數。
?
22.static數據成員必須在類定義體的外部定義。不像普通數據成員,static成員不是通過類構造函數進行初始化,而是應該在定義時進行初始化。(保證對象正好定義一次的最好辦法,就是將static數據成員的定義放在包含類的非內聯成員函數定義的文件中。
? ? ?定義static數據成員的方式與定義其他類成員和變量的方式相同:先指定類型名,接著是成員的完全限定名。
doubleAccount::interestRate = initRate();注意,盡管initRate是私有的,我們仍然可以使用該函數來初始化interestRate。像任意的其他成員定義一樣,interestRate的定義是在類的作用域中,因此可以訪問該類的私有成員。
? ? 像使用任意的類成員一樣,在類定義體外部引用類的static成員時,必須指定成員是在哪個類中定義的。然而,static關鍵字只能用于類定義體內部的聲明中,定義不能標示為static。
?
23.特殊的整型const static 成員
? ? 一般而言,類的static成員,像普通數據成員一樣,不能在類的定義體中初始化。相反,static數據成員通常在定義時才初始化。這個規則的一個例外是,只要初始化是一個常量表達式,整型const static數據成員就可以在類的定義體中進行初始化:
classAccount {public:static double rate(){return interestRate;}static void rate(double);private:static const int period = 30;double daily_tbl[period]; };? ? 注意:const static 數據成員在類的定義體中初始化時,該數據成員仍必須在類的定義體之外進行定義。在類內部提供初始化式時,成員的定義不必再指定初始值:
const int Account::period;?
24.static成員不是類對象的組成部分
? ? static成員獨立于任何對象而存在,不是類類型對象的組成部分。
(1)static 數據成員的類型可以是該成員所屬的類類型。非static成員被限定聲明為其自身類對象的指針或引用:
classBar {public://....private:static Bar mem1;Bar* mem2;Bar mem3; };
(2)static數據成員可用作默認實參:
? ? 非static數據成員不能用作默認實參,因為它的值不能獨立于所屬的對象而使用。使用非static數據成員作默認實參,將無法提供對象以獲取該成員的值,因而是錯誤的。
?
?
轉載于:https://www.cnblogs.com/wangfengju/p/6173016.html
總結
以上是生活随笔為你收集整理的C++ Primer 有感(类)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSG+VS2010+win7环境搭建-
- 下一篇: android系统各种音量的获取与设置