C++中的類
來看一個簡單的類的簡單聲明, 了解下類的基本描述
class World
{
// 私有變量外界不能直接通路
// C++中預設為private, 即使不明确寫明是private的
// 類對象的預設通路控制是private.
float mass;
char name[20];
public:
void tellall(void);
...
};
類和結構的關系:
類描述看上去很像是包含成員函數以及public和private可見性标簽的結構聲明. 實際上, C++對結構進行了擴充, 使之具有與類相同的特殊. 他們之間的唯一差別是, 結構的預設通路類型是public的, 而類的預設通路控制為private的.
實作類成員函數:
類成員函數和正常函數定義非常相似, 他們有函數頭和函數體, 也可以有傳回類型和參數, 但是他們還有兩個特殊的特征:
1.定義成員函數時, 使用作用域解析運算符(::)來辨別函數所屬的類;
2.類方法可以通路類的private元件.
首先, 成員函數的函數頭使用作用域運算符解析(::)來指出函數所屬的類, 例如update()成員函數的函數頭如下:
void Stock::update(double price)
這表示update()函數是Stock類的成員
怎麼調用對象的方法?
Shock kate, joe;
// 調用類的成員函數
kate.show();
joe.show();
所建立的每個新對象都有自己的存儲空間, 用于存儲其内部變量和類成員: 但同一個類的所有對象共享同一組方法, 即每種方法隻有一個副本. 例如: 假設kate和joe都是Stock對象, 則kate.shares将占據一個記憶體塊, 而joe.shares占用另一個記憶體塊, 但kate.show()和joe.show()都調用同一個方法, 也就是說, 他們将執行同一個代碼塊, 隻是将這些代碼用于不同的資料.
來看一個完整的例子:
類聲明檔案, 裡面聲明了類的私有變量和私有方法, 以及對外暴露的共有方法, 注意其中的set_tot()函數實際是個内聯函數
// 類聲明檔案
// stock00.h
#ifndef STOCK00_H_
#define STOCK00_H_
#include <string>
class Stock
{
// private可以不寫, 因為預設是private的
private:
std::string company;
long shares;
double share_val;
double total_val;
// 将函數定義寫在類聲明中的函數, 都自動成為内聯函數
void set_tot() {total_val = share_val * shares;}
// 這個就不是内聯函數, 因為隻有函數的聲明, 沒有函數的定義.
void test(double d);
public:
void acquire(const std::string & co, long n, double pre);
void buy(long num, double price);
void sell(long num, double price);
void update(double price);
void show();
};
#endif
來看第二個檔案, 是對應的類聲明的函數的定義
// 第二個檔案
// stock00.cpp
// 實作Stock類
#include <iostream>
#include "stock00.h"
// 要用類名+:: 函數名來表明是那個類的成員函數
void Stock::acquire(const std::string & co, long n, double pre)
{
company = co;
if(n < 0)
{
std::cout << "Number of shares can't be negative;" << company << " shares set to 0" << std::endl;
shares = 0;
} else {
shares = n;
}
share_val = pre;
set_tot();
}
void Stock::buy(long num, double price)
{
if(num < 0)
{
std::cout << "Number of shares purchased can't be negative Transaction is aborted " << std::endl;
} else {
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(long num, double price)
{
using std::cout;
if(num < 0)
{
cout << "Number of shares sold can't be negative Transaction is aborted " << std::endl;
} else if(num > shares){
cout << "You can't sell more than you have, Transaction is aborted" << std::endl;
} else {
shares -= num;
share_val = price;
set_tot();
}
}
void Stock::update(double price)
{
share_val = price;
set_tot();
}
void Stock::show()
{
std::cout << "Company: " << company << " Shares: " << shares << std::endl;
std::cout << " Share Price: $" << share_val << "Total Worth: $" << total_val << std::endl;
}
void test(double d)
{
std::cout << d << std::endl;
}
第三個檔案, 是對類的操作:
// 第三個檔案, 調用Stock類, 使用類方法
// usestock0.cpp
// compile with stock00.cpp
#include <iostream>
#include "stock00.h"
int main()
{
Stock fluffy_the_cat;
fluffy_the_cat.acquire("NanoSmart", 20, 12.50);
fluffy_the_cat.show();
fluffy_the_cat.buy(15, 18.125);
fluffy_the_cat.show();
fluffy_the_cat.sell(400, 20.00);
fluffy_the_cat.show();
fluffy_the_cat.buy(300000, 40.125);
fluffy_the_cat.show();
fluffy_the_cat.sell(300000, 0.125);
fluffy_the_cat.show();
return 0;
}
程式運作結果為:
C++中使用類的步驟如下:
1.類聲明, 格式如下:
class className
{
private:
// 成員變量
// 即使不用private , 預設也都是private的, 也就是隻能通過類成員函數進行通路
data member declarations
public:
// 成員函數的函數原型
member function prototypes;
}
2.實作類成員函數
可以在類聲明中提供完整的函數定義(如果提供了完整的函數定義, 則函數預設會是内聯函數), 而不,是函數原型, 但是通常的做飯是單獨提供函數定義(除非函數很小). 單獨提供函數定義的時候, 需要使用域解析運算符來指出成員函數屬于哪個類. 例如:
char* Bozo::Retort()
{
...
}
這個函數定義指明Retort()函數是Bozo類的一個成員函數, 傳回值是char*,
3.調用類的成員函數:
cout << Bozetta.Retort();