天天看點

C++ Primer Plus書之--C++類 簡介C++中的類類和結構的關系:

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()都調用同一個方法, 也就是說, 他們将執行同一個代碼塊, 隻是将這些代碼用于不同的資料.

C++ Primer Plus書之--C++類 簡介C++中的類類和結構的關系:

來看一個完整的例子:

類聲明檔案, 裡面聲明了類的私有變量和私有方法, 以及對外暴露的共有方法, 注意其中的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++ Primer Plus書之--C++類 簡介C++中的類類和結構的關系:

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();
           

繼續閱讀