C 程式設計入門系列之七(自定義資料型別)

2021-07-23 10:07:08 字數 3005 閱讀 5479

上兩節中雞啄公尺講了程式設計入門知識-演算法的選擇結構和迴圈結構,這一講雞啄公尺給大家介紹下自定義資料型別。

什麼是自定義資料型別呢?大家記得像char、int、float等型別嗎?這些都是c++內建的基本資料型別,這些資料型別是不能滿足我們在程式設計中的要求的,需要自己定義一些資料型別使用。自定義資料型別有:列舉型別、結構型別、聯合型別、陣列型別和類等。這一講雞啄公尺主要講列舉型別、結構型別和聯合型別,其他型別後面雞啄公尺會細講。

1.列舉型別

我們在現實當中經常遇到這種情況,描述一件事情時只能取幾個有限的值,比如,一周只有星期

一、星期二...星期日七天,比賽結果只有勝、負、平和比賽取消等四種結果。我們可以用0到6的整數表示星期一到星期日,7,8,9等都不是合法資料,如果我們用整數來表示星期幾那就需要專門判斷下是不是在0到6之間,但是如果用列舉型別定義就沒有這種問題,因為列舉型別就那幾個可能的值。列舉型別的宣告形式為:   enum  列舉型別名   ;變數值列表裡都是整型變數,另外不要忘記最後面的分號

比如,enum  weekday   ;

這裡的列舉元素sun、mon...都沒有指定值,它們就使用預設值,依次為0,1,2...。即sun就是0,mon就是1,...sat是6。也可以在宣告列舉型別時指定列舉元素的值,比如

enum  weekday  ;

這裡sun就是7,mon是1,後面的值在mon的基礎上依次加1,即tue等於2,wed為3...sat是6。列舉元素按常量處理,不能對它們賦值除了宣告的時候,像sun=0;這樣的語句就是非法的。

列舉型別我們宣告了以後就能像int、float等型別那樣用了,可以定義列舉型別的變數。整數值需要賦給列舉變數時,應進行強制型別轉換。

雞啄公尺給大家個例子:設某次體育比賽的結果有四種可能:勝(win)、負(lose)、平局(tie)、比賽取消(cancel),編寫程式順序輸出這四種情況。分析:由於比賽結果只有四種可能,所以可以宣告乙個列舉型別,宣告乙個列舉型別的變數來存放比賽結果。    

#include

using namespace std;

enum  game_result     ;

int _tmain(int argc, _tchar* argv)

else

}return 0;

}執行結果是: 

2.結構體

有時候我們需要將一些不同型別的資料組合成乙個整體,例如,乙個學生的學號、姓名、年齡和成績等,它們資料型別不同,但都屬於乙個人。這就要用到結構體了,結構體就是由不同資料型別也可以是相同資料型別的若干資料組成的結合體,宣告形式為:

struct  結構體名

;這裡最後那個分號也不要忘記哦。雞啄公尺把上面提到的那個學生的結構體可以定義成如下形式:      

struct student   //學生資訊結構體

;定義了結構體型別,我們就可以用它來定義結構體變數,就像int a;那樣。結構體型變數的定義形式也類似int等型別:  結構體型別名   結構體變數名;。比如,定義乙個上面的那個結構體變數,student  s;。可以像這樣宣告了結構體型別以後再定義結構體變數,也可以把它們放在一起。結構體變數占用記憶體的大小可以用sizeof(結構體型別名或變數名)計算。在定義結構體變數時可以直接賦初值。結構體成員的使用形式是:結構體變數名.成員名。

雞啄公尺給大家乙個結構體變數的例子。  

#include

using namespace std;

struct student        //學生資訊結構體

stu=;         // 宣告結構體型別的同時,定義結構體型別的變數,並賦初值。也可以分開。

int _tmain(int argc, _tchar* argv) ;

聯合體型別變數宣告的語法形式是:聯合體型別名   聯合體變數名;。聯合體型別變數的引用形式是:聯合體變數名.成員名。

union uarea

聯合體型別在記憶體中是怎樣占用記憶體單元的呢?聯合體占用的記憶體大小是其佔記憶體最大的成員需要的記憶體大小,就像上邊的uarea,它占用的記憶體大小就是最大成員long需要的4個位元組。聯合體裡同時只能放乙個成員的值。uarea放c_data時c_data占用第乙個位元組,放s_data時s_data占用前兩個位元組,放l_data時l_data占用全部的4個位元組。

union

在程式總可以直接用成員項i和f的名字訪問i和f,比如 i=2; f=3.2;。無名聯合體一般是用作結構體的內嵌成員。雞啄公尺給寫乙個使用聯合體的例子:

#include

using namespace std;

union myun

u;}a;

int _tmain(int argc, _tchar* argv)

這個程式輸出0 5 6。為什麼呢?不應該是4,5,6嗎?因為聯合體的成員共用記憶體,所以a.u.x占用的記憶體裡的4被後來的a.k覆蓋了,變成了0。

4.型別定義語句--typedef

我們程式設計時除了可以使用基本資料型別名和自定義的資料型別名以外還可以給乙個已經存在的資料型別起個別名,這樣做有幾個好處,可以給已有的型別起乙個有意義的名字,我們一看就知道它表示什麼,提高可讀性;還可以給較長的型別名另起乙個短名。使用的語法形式是:typedef   已有型別名  新型別名錶;。新型別名錶中可以有多個識別符號,它們之間用逗號分開,就是在乙個typedef語句中可以為乙個已有資料型別宣告多個別名,比如,

typedef  double  length,width;

length  a;

width   b;

C 自定義List類

如下 using system using system.collections.generic using system.linq using system.text namespace myarraylist public myarraylist int capacity 索引器 public ...

C 自定義類排序

1 宣告乙個類 人物類 public class person 2 宣告乙個繼承了介面icomparer的類 比較人物類例項大小,實現介面icomparer public class personcomparer icomparer return 0 3 main函式,建立乙個list,並使用剛建立...

c 自定義string類

1.標頭檔案部分 define crt secure no warnings pragma once include includeusing namespace std class mystring 2.函式定義部分 include mystring.h mystring mystring mys...