1、類規範 類聲明:包括數據成員、成員函數(共有介面)的聲明 類方法定義 C++程式員將介面(類)放在頭文件中,將實現放在源代碼文件中 類設計儘量將共有介面和實現細節分開,數據隱藏(將數據放在私有部分中)是一種封裝,將實現細節隱藏在私有部分中也是一種封裝。將類函數定義和類聲明放在不同文件中也是一種封 ...
1、類規範
- 類聲明:包括數據成員、成員函數(共有介面)的聲明
- 類方法定義
C++程式員將介面(類)放在頭文件中,將實現放在源代碼文件中
類設計儘量將共有介面和實現細節分開,數據隱藏(將數據放在私有部分中)是一種封裝,將實現細節隱藏在私有部分中也是一種封裝。將類函數定義和類聲明放在不同文件中也是一種封裝
註:類方法預設是內聯函數
2、訪問控制符
類預設的訪問控制符是private
3、類和結構體
類和結構的區別是:
1、結構的預設訪問類型是public,而類為private。
2、結構體在聲明變數時,可以直接像標準類型那樣初始化,而類需要構造函數進行初始化,當所有成員變數都是public修飾時,可以像struct那樣初始化對象
如:
int a = 2; struct node { int a; string s; }; node n = {3,"abc"};
Stock hot = {2,"abc"};//編譯錯誤
C語言中結構體不允許定義函數成員,且沒有訪問控制符的概念。
C++為C語言中的結構體引入了成員函數、訪問控制符、繼承、包含多態等面向對象特性
C++保留struct結構體原因:C++在struct之外引入了class關鍵字,但為了保持與C程式的相容,C++保留了struct關鍵字,並規定預設訪問許可權為public
另外,在C語言中,空結構體的大小為0,而在C++中空結構體(屬於空類)的大小為1
C++中空類的大小為1的原因:
空類也可以實例化,類實例化出的每個對象都需要有不同的記憶體地址,為使每個對象在記憶體中的地址不同,所以在類中會加入一個隱含的位元組
預設構造函數
預設構造函數是在未提供顯示初始值時,用來創建對象的構造函數。預設構造函數可能是這樣,比如:
Stock::Stock() {}
預設構造函數沒有參數,因為聲明中不包含值
當且僅當沒有定義任何構造函數時,編譯器才提供預設構造函數,為類定義了構造函數後,程式員就必須為它提供預設構造函數。如果提供了非預設構造函數,而沒有提供預設構造函數,則下麵的聲明會出錯:
Stock stock1;
這樣做的原因可能是想禁止創建未初始化的對象,然而,如果要創建對象,而不是顯式地初始化,則必須定義一個不接受任何參數的預設構造函數。定義預設構造函數的方式有兩種。一種是給已有的構造函數的所有參數提供預設值:
Stock(const string &co = "Error",int n = 0,double pr = 0.0);
另一種方式是通過函數重載來定義另一個構造函數--一個沒有參數的構造函數:
Stock();
由於只能有一個預設構造函數,因此不要同時採用這兩種方式。
在設計類時,通常應提供對所有類成員做隱式初始化的預設構造函數
如:
Stock::Stock()
{
company = "no name";
shares = 0;
share_val = 0.0;
total_val = 0.0;
}
析構函數
析構函數完成清理工作,如果構造函數使用new來分配記憶體,則析構函數將使用delete來釋放這些記憶體
析構函數的調用:
- 如果創建的是靜態存儲類對象,則其析構函數將在程式結束時自動被調用
- 如果創建的是自動存儲類對象,則其析構函數將在程式執行完代碼塊時自動被調用
- 如果對象是通過new來創建的,則它將駐留在棧記憶體或自由存儲區中,當使用delete來釋放記憶體時,其析構函數將自動被調用
例子:
Stock stock1("abc",12,20.0);
創建一個名為stock1的對象,並將其數據成員初始化為指定的值
下麵的語句使用另一種語法創建並初始化一個名為stock2的對象:
Stock stock2 = Stock("Boffo",2,2.0)
這種方法可能創建臨時對象,也可能不創建臨時對象
另一種方式是創建一個臨時對象,然後將臨時對象賦值到stock2中,並丟棄它,如果編譯器使用的是這種方式,則將為臨時對象調用析構函數
Stock st1("Nanosmart",12,20.0);
Stock st2 = Stock("Bob",2,2.0);
st1 = Stock("Niffy",10,50.0);//將創建臨時對象,並複製給st1
析構函數的調用順序是按聲明順序的棧序列進行的,即先聲明的對象,後析構
C++11列表初始化
C++11中,可將列表初始化語法用於類,只要提供與某個構造函數的參數列表匹配的內容,並用大括弧將它們括起:
Stock hot_tip = {"Derivatives Plus Plus",100,45.0}; Stock jock {"Sport Age Storage,Inc"}; Stock temp {};
在前兩個聲明中,用大括弧括起來的列表與下麵的構造函數匹配:
Stock::Stock(const std::string &co, long n = 0, double pr = 0.0);