C++基礎

基礎

一、特性

C++ 完全支持面向對象的程序設計,包括面向對象開發的四大特性:

  • 封裝
  • 抽象
  • 繼承
  • 多態

二、標準庫

標準的 C++ 由三個重要部分組成:

  • 核心語言,提供了所有構件塊,包括變量、數據類型和常量,等等。
  • C++ 標準庫,提供了大量的函數,用於操作文件、字符串等。
  • 標準模板庫(STL),提供了大量的方法,用於操作數據結構等。

三、語法

C++ 基本語法
  • 對象
  • 方法
  • 即時變量
三字符組

三字符組就是用於表示另一個字符的三個字符序列,又稱爲三字符序列。三字符序列總是以兩個問號開頭。

三字符序列不太常見,但 C++ 標準允許把某些字符指定爲三字符序列。以前爲了表示鍵盤上沒有的字符,這是必不可少的一種方法。

四、C++ 數據類型

基本的內置類型
  • 布爾型 bool

  • 字符型 char

  • 整型 int

  • 浮點型 float

  • 雙浮點型 double

  • 無類型 void

  • 寬字符型 wchar_t

一些基本類型可以使用一個或多個類型修飾符進行修飾:

  • signed

  • unsigned

  • short

  • long

typedef 聲明

可以使用 typedef 爲一個已有的類型取一個新的名字。下面是使用 typedef 定義一個新類型的語法:

typedef type newname;

枚舉類型

枚舉類型(enumeration)是C++中的一種派生數據類型,它是由用戶定義的若干枚舉常量的集合。

如果一個變量只有幾種可能的值,可以定義爲枚舉(enumeration)類型。所謂"枚舉"是指將變量的值一一列舉出來,變量的值只能在列舉出來的值的範圍內。

創建枚舉,需要使用關鍵字 enum。枚舉類型的一般形式爲:


enum 枚舉名{ 
     標識符[=整型常數], 
     標識符[=整型常數], 
... 
    標識符[=整型常數]
} 枚舉變量;


五、C++ 變量類型

C++ 中的變量定義

變量定義就是告訴編譯器在何處創建變量的存儲,以及如何創建變量的存儲。變量定義指定一個數據類型,幷包含了該類型的一個或多個變量的列表,如下所示:

type variable_list;

type 必須是一個有效的 C++ 數據類型

C++ 中的變量聲明

變量聲明向編譯器保證變量以給定的類型和名稱存在,這樣編譯器在不需要知道變量完整細節的情
況下也能繼續進一步的編譯。變量聲明只在編譯時有它的意義,在程序連接時編譯器需要實際的變
量聲明。

C++ 修飾符類型

C++ 允許在 char、int 和 double 數據類型前放置修飾符。修飾符用於改變基本類型的含義,所以它更能滿足各種情境的需求。

下面列出了數據類型修飾符:

  • signed

  • unsigned

  • long

  • short

六、C++ 存儲類

存儲類定義 C++ 程序中變量/函數的範圍(可見性)和生命週期。這些說明符放置在它們所修飾的類型之前。下面列出 C++ 程序中可用的存儲類:

  • auto

  • register

  • static

  • extern

  • mutable

  • thread_local (C++11)

從 C++ 11 開始,auto 關鍵字不再是 C++ 存儲類說明符,且 register 關鍵字被棄用。

extern 存儲類

extern 存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當您使用 ‘extern’ 時,對於無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。
當您有多個文件且定義了一個可以在其他文件中使用的全局變量或函數時,可以在其他文件中使用 extern 來得到已定義的變量或函數的引用。可以這麼理解,extern 是用來在另一個文件中聲明一個全局變量或函數。

thread_local 存儲類

使用 thread_local 說明符聲明的變量僅可在它在其上創建的線程上訪問。 變量在創建線程時創建,並在銷燬線程時銷燬。 每個線程都有其自己的變量副本。
thread_local 說明符可以與 static 或 extern 合併。
可以將 thread_local 僅應用於數據聲明和定義,thread_local 不能用於函數聲明或定義。

七、C++ 循環

循環類型

C++ 編程語言提供了以下幾種循環類型。

循環類型 描述
while 循環 當給定條件爲真時,重複語句或語句組。它會在執行循環主體之前測試條件
for 循環 多次執行一個語句序列,簡化管理循環變量的代碼
do…while 循環 除了它是在循環主體結尾測試條件外,其他與 while 語句類似
嵌套循環 可以在 while、for 或 do…while 循環內使用一個或多個循環
循環控制語句

循環控制語句更改執行的正常序列。當執行離開一個範圍時,所有在該範圍中創建的自動對象都會被銷燬。

C++ 提供了下列的控制語句。

循環類型 描述
break 語句 終止 loop 或 switch 語句,程序流將繼續執行緊接着 loop 或 switch 的下一條語句。
continue 語句 引起循環跳過主體的剩餘部分,立即重新開始測試條件。
goto 語句 將控制轉移到被標記的語句。但是不建議在程序中使用 goto 語句。

八、C++ 函數

函數是一組一起執行一個任務的語句。每個 C++ 程序都至少有一個函數,即主函數 main() ,所有簡單的程序都可以定義其他額外的函數。
您可以把代碼劃分到不同的函數中。如何劃分代碼到不同的函數中是由您來決定的,但在邏輯上,劃分通常是根據每個函數執行一個特定的任務來進行的。
函數聲明告訴編譯器函數的名稱、返回類型和參數。函數定義提供了函數的實際主體。
C++ 標準庫提供了大量的程序可以調用的內置函數。例如,函數 strcat() 用來連接兩個字符串,函數 memcpy() 用來複制內存到另一個位置。
函數還有很多叫法,比如方法、子例程或程序,等等。

在 C++ 中,函數由一個函數頭和一個函數主體組成。下面列出一個函數的所有組成部分:

  • 返回類型:一個函數可以返回一個值。return_type 是函數返回的值的數據類型。有些函數執行所需的操作而不返回值,在這種情況下,return_type 是關鍵字 void。
  • 函數名稱:這是函數的實際名稱。函數名和參數列表一起構成了函數簽名。
  • 參數:參數就像是佔位符。當函數被調用時,您向參數傳遞一個值,這個值被稱爲實際參數。參數列表包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
  • 函數主體:函數主體包含一組定義函數執行任務的語句。
函數參數

如果函數要使用參數,則必須聲明接受參數值的變量。這些變量稱爲函數的形式參數。
形式參數就像函數內的其他局部變量,在進入函數時被創建,退出函數時被銷燬。
當調用函數時,有兩種向函數傳遞參數的方式:

調用類型 描述
傳值調用 該方法把參數的實際值複製給函數的形式參數。在這種情況下,修改函數內的形式參數對實際參數沒有影響。
指針調用 該方法把參數的地址複製給形式參數。在函數內,該地址用於訪問調用中要用到的實際參數。這意味着,修改形式參數會影響實際參數。
引用調用 該方法把參數的引用複製給形式參數。在函數內,該引用用於訪問調用中要用到的實際參數。這意味着,修改形式參數會影響實際參數。
Lambda 函數與表達式

C++11 提供了對匿名函數的支持,稱爲 Lambda 函數(也叫 Lambda 表達式)。
Lambda 表達式把函數看作對象。Lambda 表達式可以像對象一樣使用,比如可以將它們賦給變量和作爲參數傳遞,還可以像函數一樣對其求值。

九、C++ 數組

C++ 數組

C++ 支持數組數據結構,它可以存儲一個固定大小的相同類型元素的順序集合。數組是用來存儲一系列數據,但它往往被認爲是一系列相同類型的變量。

數組的聲明並不是聲明一個個單獨的變量,比如 number0、number1、…、number99,而是聲明一個數組變量,比如 numbers,然後使用 numbers[0]、numbers[1]、…、numbers[99] 來代表一個個單獨的變量。數組中的特定元素可以通過索引訪問。

所有的數組都是由連續的內存位置組成。最低的地址對應第一個元素,最高的地址對應最後一個元素

聲明數組

在 C++ 中要聲明一個數組,需要指定元素的類型和元素的數量,如下所示:

type arrayName [ arraySize ];

初始化數組

在 C++ 中,可以逐個初始化數組,也可以使用一個初始化語句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

大括號 { } 之間的值的數目不能大於我們在數組聲明時在方括號 [ ] 中指定的元素數目。
如果省略掉了數組的大小,數組的大小則爲初始化時元素的個數。因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

創建一個數組,它與前一個實例中所創建的數組是完全相同的。下面是一個爲數組中某個元素賦值的實例:
balance[4] = 50.0;

上述的語句把數組中第五個元素的值賦爲 50.0。所有的數組都是以 0 作爲它們第一個元素的索引,也被稱爲基索引,數組的最後一個索引是數組的總大小減去 1。以下是上面所討論的數組的的圖形表示:

訪問數組元素

數組元素可以通過數組名稱加索引進行訪問。元素的索引是放在方括號內,跟在數組名稱的後邊。例如:

double salary = balance[9];

C++ 中數組詳解
概念 描述
多維數組 C++ 支持多維數組。多維數組最簡單的形式是二維數組。
指向數組的指針 可以通過指定不帶索引的數組名稱來生成一個指向數組中第一個元素的指針。
傳遞數組給函數 可以通過指定不帶索引的數組名稱來給函數傳遞一個指向數組的指針。
從函數返回數組 C++ 允許從函數返回數組。

十、C++ 字符串

C++ 提供了以下兩種類型的字符串表示形式:

  • C 風格字符串
  • C++ 引入的 string 類類型
C 風格字符串

C 風格的字符串起源於 C 語言,並在 C++ 中繼續得到支持。字符串實際上是使用 null 字符 ‘\0’ 終止的一維字符數組。因此,一個以 null 結尾的字符串,包含了組成字符串的字符。

下面的聲明和初始化創建了一個 “Hello” 字符串。由於在數組的末尾存儲了空字符,所以字符數組的大小比單詞 “Hello” 的字符數多一個。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

依據數組初始化規則,可以把上面的語句寫成以下語句:

char greeting[] = "Hello";

以下是 C/C++ 中定義的字符串的內存表示:

C++ 中有大量的函數用來操作以 null 結尾的字符串:supports a wide range of functions that manipulate null-terminated strings:

序號 函數 & 目的
1 strcpy(s1, s2);複製字符串 s2 到字符串 s1。
2 strcat(s1, s2);連接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1);返回字符串 s1 的長度。
4 strcmp(s1, s2);如果 s1 和 s2 是相同的,則返回 0;如果 s1<s2 則返回值小於 0;如果 s1>s2 則返回值大於 0。
5 strchr(s1, ch);返回一個指針,指向字符串 s1 中字符 ch 的第一次出現的位置。
6 strstr(s1, s2);返回一個指針,指向字符串 s1 中字符串 s2 的第一次出現的位置。
C++ 中的 String 類

C++ 標準庫提供了 string 類類型,支持上述所有的操作,另外還增加了其他更多的功能。


#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
   string str1 = "Hello";
   string str2 = "World";
   string str3;
   int  len ;
 
   // 複製 str1 到 str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;
 
   // 連接 str1 和 str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;
 
   // 連接後,str3 的總長度
   len = str3.size();
   cout << "str3.size() :  " << len << endl;
 
   return 0;
}

結果:

十一、C++ 指針

通過指針,可以簡化一些 C++ 編程任務的執行,還有一些任務,如動態內存分配,沒有指針是無法執行的。

每一個變量都有一個內存位置,每一個內存位置都定義了可使用連字號(&)運算符訪問的地址,它表示了在內存中的一個地址

什麼是指針?

指針是一個變量,其值爲另一個變量的地址,即,內存位置的直接地址。就像其他變量或常量一樣,必須在使用指針存儲其他變量地址之前,對其進行聲明。指針變量聲明的一般形式爲:

type *var-name;

在這裏,type 是指針的基類型,它必須是一個有效的 C++ 數據類型,var-name 是指針變量的名稱。用來聲明指針的星號 * 與乘法中使用的星號是相同的。但是,在這個語句中,星號是用來指定一個變量是指針。以下是有效的指針聲明:

int    *ip;    /* 一個整型的指針 */
double *dp;    /* 一個 double 型的指針 */
float  *fp;    /* 一個浮點型的指針 */
char   *ch;    /* 一個字符型的指針 */

所有指針的值的實際數據類型,不管是整型、浮點型、字符型,還是其他的數據類型,都是一樣的,都是一個代表內存地址的長的十六進制數。不同數據類型的指針之間唯一的不同是,指針所指向的變量或常量的數據類型不同。

C++ 中使用指針

使用指針時會頻繁進行以下幾個操作:

  • 定義一個指針變量、
  • 把變量地址賦值給指針、
  • 訪問指針變量中可用地址的值。

這些是通過使用一元運算符 * 來返回位於操作數所指定地址的變量的值


#include <iostream>

using namespace std;

int main ()
{
    int  var = 20;   // 實際變量的聲明
    int  *ip;        // 指針變量的聲明

    ip = &var;       // 在指針變量中存儲 var 的地址

    cout << "變量值: ";
    cout << var << endl;

    // 輸出在指針變量中存儲的地址
    cout << "變量地址 ";
    cout << ip << endl;

    // 訪問指針中地址的值
    cout << "指針中地址的值: ";
    cout << *ip << endl;

    return 0;
}

C++ 指針詳解

在 C++ 中,有很多指針相關的概念,這些概念都很簡單,但是都很重要.

概念 描述
C++ Null 指針 C++ 支持空指針。NULL 指針是一個定義在標準庫中的值爲零的常量。
C++ 指針的算術運算 可以對指針進行四種算術運算:++、–、+、-
C++ 指針 vs 數組 指針和數組之間有着密切的關係。
C++ 指針數組 可以定義用來存儲指針的數組。
C++ 指向指針的指針 C++ 允許指向指針的指針。
C++ 傳遞指針給函數 通過引用或地址傳遞參數,使傳遞的參數在調用函數中被改變。
C++ 從函數返回指針 C++ 允許函數返回指針到局部變量、靜態變量和動態內存分配。

十二、C++ 引用

引用變量是一個別名,也就是說,它是某個已存在變量的另一個名字。一旦把引用初始化爲某個變量,就可以使用該引用名稱或變量名稱來指向變量。

C++ 引用 vs 指針

引用很容易與指針混淆,它們之間有三個主要的不同:

  • 不存在空引用。引用必須連接到一塊合法的內存。
  • 一旦引用被初始化爲一個對象,就不能被指向到另一個對象。指針可以在任何時候指向到另一個對象。
  • 引用必須在創建時被初始化。指針可以在任何時間被初始化。
C++ 中創建引用

變量名稱是變量附屬在內存位置中的標籤,可以把引用當成是變量附屬在內存位置中的第二個標籤。因此可以通過原始變量名稱或引用來訪問變量的內容

引用通常用於函數參數列表和函數返回值。引用相關的重要概念:

概念 描述
把引用作爲參數 C++ 支持把引用作爲參數傳給函數,這比傳一般的參數更安全。
把引用作爲返回值 可以從 C++ 函數中返回引用,就像返回其他數據類型一樣。

十三、C++ 日期 & 時間

C++ 標準庫沒有提供所謂的日期類型。C++ 繼承了 C 語言用於日期和時間操作的結構和函數。爲了使用日期和時間相關的函數和結構,需要在 C++ 程序中引用 頭文件。

有四個與時間相關的類型:clock_t、time_t、size_t 和 tm。類型 clock_t、size_t 和 time_t 能夠把系統時間和日期表示爲某種整數。

結構類型 tm 把日期和時間以 C 結構的形式保存,tm 結構的定義如下:

struct tm {
  int tm_sec;   // 秒,正常範圍從 0 到 59,但允許至 61
  int tm_min;   // 分,範圍從 0 到 59
  int tm_hour;  // 小時,範圍從 0 到 23
  int tm_mday;  // 一月中的第幾天,範圍從 1 到 31
  int tm_mon;   // 月,範圍從 0 到 11
  int tm_year;  // 自 1900 年起的年數
  int tm_wday;  // 一週中的第幾天,範圍從 0 到 6,從星期日算起
  int tm_yday;  // 一年中的第幾天,範圍從 0 到 365,從 1 月 1 日算起
  int tm_isdst; // 夏令時
}

下面是 C/C++ 中關於日期和時間的重要函數。所有這些函數都是 C/C++ 標準庫的組成部分

序號 函數 & 描述
1 time_t time(time_t *time);該函數返回系統的當前日曆時間,自 1970 年 1 月 1 日以來經過的秒數。如果系統沒有時間,則返回 .1。
2 char *ctime(const time_t *time);該返回一個表示當地時間的字符串指針,字符串形式 day month year hours:minutes:seconds year\n\0。
3 struct tm *localtime(const time_t *time);該函數返回一個指向表示本地時間的 tm 結構的指針。
4 clock_t clock(void);該函數返回程序執行起(一般爲程序的開頭),處理器時鐘所使用的時間。如果時間不可用,則返回 .1。
5 char * asctime ( const struct tm * time );該函數返回一個指向字符串的指針,字符串包含了 time 所指向結構中存儲的信息,返回形式爲:day month date hours:minutes:seconds year\n\0。
6 struct tm *gmtime(const time_t *time);該函數返回一個指向 time 的指針,time 爲 tm 結構,用協調世界時(UTC)也被稱爲格林尼治標準時間(GMT)表示。
7 time_t mktime(struct tm *time);該函數返回日曆時間,相當於 time 所指向結構中存儲的時間。
8 double difftime ( time_t time2, time_t time1 );該函數返回 time1 和 time2 之間相差的秒數。
9 size_t strftime();該函數可用於格式化日期和時間爲指定的格式。
當前日期和時間

#include <iostream>
#include <ctime>
 
using namespace std;
 
int main( )
{
   // 基於當前系統的當前日期/時間
   time_t now = time(0);
   
   // 把 now 轉換爲字符串形式
   char* dt = ctime(&now);
 
   cout << "本地日期和時間:" << dt << endl;
 
   // 把 now 轉換爲 tm 結構
   tm *gmtm = gmtime(&now);
   dt = asctime(gmtm);
   cout << "UTC 日期和時間:"<< dt << endl;
}

使用結構 tm 格式化時間

tm 結構在 C/C++ 中處理日期和時間相關的操作時,顯得尤爲重要。tm 結構以 C 結構的形式保存日期和時間。大多數與時間相關的函數都使用了 tm 結構。下面的實例使用了 tm 結構和各種與日期和時間相關的函數。


#include <iostream>
#include <ctime>
 
using namespace std;
 
int main( )
{
   // 基於當前系統的當前日期/時間
   time_t now = time(0);
 
   cout << "1970 到目前經過秒數:" << now << endl;
 
   tm *ltm = localtime(&now);
 
   // 輸出 tm 結構的各個組成部分
   cout << "年: "<< 1900 + ltm->tm_year << endl;
   cout << "月: "<< 1 + ltm->tm_mon<< endl;
   cout << "日: "<<  ltm->tm_mday << endl;
   cout << "時間: "<< ltm->tm_hour << ":";
   cout << ltm->tm_min << ":";
   cout << ltm->tm_sec << endl;
}

十四、C++ 基本的輸入輸出

C++ 的 I/O 發生在流中,流是字節序列。如果字節流是從設備(如鍵盤、磁盤驅動器、網絡連接等)流向內存,這叫做輸入操作。如果字節流是從內存流向設備(如顯示屏、打印機、磁盤驅動器、網絡連接等),這叫做輸出操作。

I/O 庫頭文件
頭文件 函數和描述
<iostream> 該文件定義了 cin、cout、cerr 和 clog 對象,分別對應於標準輸入流、標準輸出流、非緩衝標準錯誤流和緩衝標準錯誤流。
<iomanip> 該文件通過所謂的參數化的流操縱器(比如 setw 和 setprecision),來聲明對執行標準化 I/O 有用的服務。
<fstream> 該文件爲用戶控制的文件處理聲明服務。我們將在文件和流的相關章節討論它的細節。
標準輸出流(cout)

定義的對象 cout 是 iostream 類的一個實例。cout 對象"連接"到標準輸出設備,通常是顯示屏。cout 是與流插入運算符 << 結合使用的

C++ 編譯器根據要輸出變量的數據類型,選擇合適的流插入運算符來顯示值。<< 運算符被重載來輸出內置類型(整型、浮點型、double 型、字符串和指針)的數據項。
流插入運算符 << 在一個語句中可以多次使用

標準輸入流(cin)

預定義的對象 cin 是 iostream 類的一個實例。cin 對象附屬到標準輸入設備,通常是鍵盤。cin 是與流提取運算符 >> 結合使用的

標準錯誤流(cerr)

預定義的對象 cerr 是 iostream 類的一個實例。cerr 對象附屬到標準錯誤設備,通常也是顯示屏,但是 cerr 對象是非緩衝的,且每個流插入到 cerr 都會立即輸出。
cerr 也是與流插入運算符 << 結合使用的

標準日誌流(clog)

定義的對象 clog 是 iostream 類的一個實例。clog 對象附屬到標準錯誤設備,通常也是顯示屏,但是 clog 對象是緩衝的。這意味着每個流插入到 clog 都會先存儲在緩衝在,直到緩衝填滿或者緩衝區刷新時纔會輸出。
clog 也是與流插入運算符 << 結合使用的

我們無法區分 cout、cerr 和 clog 的差異,但在編寫和執行大型程序時,它們之間的差異就變得非常明顯。所以良好的編程實踐告訴我們,使用 cerr 流來顯示錯誤消息,而其他的日誌消息則使用 clog 流來輸出

十五、C++ 數據結構

C/C++ 數組允許定義可存儲相同類型數據項的變量,但是結構是 C++ 中另一種用戶自定義的可用的數據類型,它允許您存儲不同類型的數據項。
結構用於表示一條記錄。

定義結構

爲了定義結構,必須使用 struct 語句。struct 語句定義了一個包含多個成員的新的數據類型,struct 語句的格式如下:


struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;

  • type_name 是結構體類型的名稱
  • member_type1 member_name1 是標準的變量定義,比如 int i; 或者 float f;
    或者其他有效的變量定義。
  • 在結構定義的末尾,最後一個分號之前,可以指定一個或多個結構變量,這是可選的
訪問結構成員

爲了訪問結構的成員,使用成員訪問運算符(.)。成員訪問運算符是結構變量名稱和我們要訪問的結構成員之間的一個句號。

結構作爲函數參數

可以把結構作爲函數參數,傳參方式與其他類型的變量或指針類似

實例


#include <iostream>
#include <cstring>
 
using namespace std;
 
// 聲明一個結構體類型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定義結構體類型 Books 的變量 Book1
   Books Book2;        // 定義結構體類型 Books 的變量 Book2
 
   // Book1 詳述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "ycp"); 
   strcpy( Book1.subject, "編程語言");
   Book1.book_id = 12345;
 
   // Book2 詳述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "ycp");
   strcpy( Book2.subject, "前端技術");
   Book2.book_id = 12346;
 
   // 輸出 Book1 信息
   cout << "第一本書標題 : " << Book1.title <<endl;
   cout << "第一本書作者 : " << Book1.author <<endl;
   cout << "第一本書類目 : " << Book1.subject <<endl;
   cout << "第一本書 ID : " << Book1.book_id <<endl;
 
   // 輸出 Book2 信息
   cout << "第二本書標題 : " << Book2.title <<endl;
   cout << "第二本書作者 : " << Book2.author <<endl;
   cout << "第二本書類目 : " << Book2.subject <<endl;
   cout << "第二本書 ID : " << Book2.book_id <<endl;
 
   return 0;
}

結構作爲函數參數

以把結構作爲函數參數,傳參方式與其他類型的變量或指針類似

實例


#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books book );
 
// 聲明一個結構體類型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定義結構體類型 Books 的變量 Book1
   Books Book2;        // 定義結構體類型 Books 的變量 Book2
 
    // Book1 詳述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "ycp"); 
   strcpy( Book1.subject, "編程語言");
   Book1.book_id = 12345;
 
   // Book2 詳述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "ycp");
   strcpy( Book2.subject, "前端技術");
   Book2.book_id = 12346;
 
   // 輸出 Book1 信息
   printBook( Book1 );
 
   // 輸出 Book2 信息
   printBook( Book2 );
 
   return 0;
}
void printBook( struct Books book )
{
   cout << "書標題 : " << book.title <<endl;
   cout << "書作者 : " << book.author <<endl;
   cout << "書類目 : " << book.subject <<endl;
   cout << "書 ID : " << book.book_id <<endl;
}

指向結構的指針

可以定義指向結構的指針,方式與定義指向其他類型變量的指針相似,如下所示:

struct Books *struct_pointer;

現在,可以在上述定義的指針變量中存儲結構變量的地址。爲了查找結構變量的地址,把 & 運算符放在結構名稱的前面,如下所示:

struct_pointer = &Book1;

爲了使用指向該結構的指針訪問結構的成員,必須使用 -> 運算符,如下所示:

struct_pointer->title;

重寫上面的例子


#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books *book );
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定義結構體類型 Books 的變量 Book1
   Books Book2;        // 定義結構體類型 Books 的變量 Book2
 
    // Book1 詳述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "ycp"); 
   strcpy( Book1.subject, "編程語言");
   Book1.book_id = 12345;
 
   // Book2 詳述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "ycp");
   strcpy( Book2.subject, "前端技術");
   Book2.book_id = 12346;
 
   // 通過傳 Book1 的地址來輸出 Book1 信息
   printBook( &Book1 );
 
   // 通過傳 Book2 的地址來輸出 Book2 信息
   printBook( &Book2 );
 
   return 0;
}
// 該函數以結構指針作爲參數
void printBook( struct Books *book )
{
   cout << "書標題  : " << book->title <<endl;
   cout << "書作者 : " << book->author <<endl;
   cout << "書類目 : " << book->subject <<endl;
   cout << "書 ID : " << book->book_id <<endl;
}

typedef 關鍵字

下面是一種更簡單的定義結構的方式,可以爲創建的類型取一個"別名"。例如:

typedef struct
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

現在,可以直接使用 Books 來定義 Books 類型的變量,而不需要使用 struct 關鍵字。下面是實例:

Books Book1, Book2;

可以使用 typedef 關鍵字來定義非結構類型,如下所示:
typedef long int *pint32;

pint32 x, y, z;

x, y 和 z 都是指向長整型 long int 的指針。

發佈了32 篇原創文章 · 獲贊 1 · 訪問量 7740
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章