C++:結構和類

數據結構

從最基本的層面理解,數據結構是把一組相關的數據元素組織起來然後使用它們的策略和方法。在C++語言中,可以通過結構(Struct)和類(Class)的形式自定義數據結構。

預處理器

確保頭文件多次包含仍能安全工作的常用技術是預處理器(Preprocessor),它由C++語言從C語言繼承而來。預處理器是在編譯之前執行的一段程序,可以部分地改變我們寫的程序。

C++程序會用到的一項預處理功能是頭文件保護符(Header Guard),頭文件保護符依賴於預處理變量。預處理變量由兩種狀態:已定義和未定義。#define指令把一個名字設定爲預處理變量,另外兩個指令則分別檢查某個指定的預處理變量是否已經定義:#ifdef當且僅當變量已定義時爲真,#ifndef當且僅當變量未定義時爲真。一旦檢查結果爲真,則執行後續操作直至遇到#endif指令爲止。如下所示,使用這些功能可以有效地防止頭文件重複包含的發生:

頭文件:include_name.h

#ifndef INCLUDE_NAME_H
#define INCLUDE_NAME_H

/* ... */

#endif

第一次包含頭文件include_name.h時,#ifndef的檢查結果爲真,預處理器將順序執行後面的操作直至遇到#endif爲止。此時,預處理變量INCLUDE_NAME_H的值將變爲已定義,而且include_name.h也會被拷貝到我們的程序中來。後面如果再一次包含include_name.h,則#ifndef的檢查結果將爲假,編譯器將忽略#ifndef#endif之間的部分。如此,就有效地防止了頭文件重複包含的發生。

類(class)

類的基本思想是數據抽象(Data Abstraction)和封裝(Encapsulation)。數據抽象是一種依賴於接口(Interface)和實現(Implementation)分離的編程技術。類的接口包括用戶所能執行的操作;類的實現則包括類的數據成員、負責接口實現的函數體以及定義類所需的各種私有函數。封裝實現了類的接口和實現的分離。封裝後的類隱藏了它的實現細節,也就是說,類的用戶只能使用接口而無法訪問實現部分。類要想實現數據抽象和封裝,需要首先定義一個抽象數據類型(Abstract Data Type)。在抽象數據類型中,由類的設計者負責類的實現過程;使用該類的程序員則只需要抽象地思考做了什麼,而無須瞭解類型的工作細節。

注意:(1)程序員們常把運行其程序的人稱作用戶(user)。類似的,類的設計者也是爲其用戶設計並實現一個類的人;顯然,類的用戶是程序員,而非應用程序的最終使用者。

結構(struct)

結構的定義語法

struct structName
{
  int a=0;
  /* ... */
};

結構的定義以關鍵字struct開始,緊跟着結構名結構體(結構體部分可以爲空),以分號";"作爲定義的結束。結構體由花括號包圍形成了一個新的作用域。結構內部定義的名字必須唯一,但是可以與類外部定義的名字重複。結構體右側的表示結束的花括號後必須寫一個分號,這是因爲結構體後面可以緊跟變量名以示對該類型對象的定義,所以分號必不可少:struct Sales_data { /* ... */ } accum, trans, *salesptr;。分號表示聲明符的結束。一般來說,最好不要把對象的定義和結構的定義放在一起。這麼做無異於把兩種不同實體的定義混在了一條語句裏,一會兒定義結構,一會兒又定義變量,顯然這是一種不被建議的行爲。

現以定義一個Sales_data結構爲例,Sales_data在頭文件sales_data.h的初步定義如下:

頭文件:sales_data.h

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data
{
  std::string bookNo;
  unsigned units_sold=0;
  double revenue=0.0;
};//注意:定義結構時,不要忘記此分號
#endif

結構數據成員(Data Member)

結構體定義結構的成員,我們的結構Sales_data只有數據成員。結構的數據成員定義了結構的對象的具體內容,每個對象有自己的一份數據成員拷貝。修改一個對象的數據成員,不會影響其他該結構的對象。

定義數據成員的方法和定義普通變量一樣:首先說明一個基本類型,隨後緊跟一個或多個聲明符。我們的結構有3個數據成員:一個名爲bookNo的string成員、一個名爲units_sold的unsigned成員和一個名爲revenue的double成員。每個Sales_data的對象都將包含這3個數據成員。

結構Sales_data的使用

源程序文件:main.cpp

#include <iostream>
#include <string>
//把定義結構Sales_data的頭文件包含進來
#include "sales_data.h"

using namespace std;

int main(int argc,char** argv)
{
  //定義兩個Sales_data結構類型的對象
  Sales_data data1,data2;
  //書的單價,用於計算銷售收入
  double price=0;
  //讀入第1筆交易:ISBN、銷售數量、單價
  cin>>data1.bookNo>>data1.units_sold>>price;
  //計算銷售收入
  data1.revenue=data1.units_sold*price;

  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章