主要內容
C++允許用戶聲明自定義類型(Undefined Type,UDT),包括結構體(structure)類型、共用體(union)類型、枚舉(enumeration)類型、類(class)類型。
C++的類(class)類型就是在結構體類型基礎上擴充發展起來的。
結構體
sturct是聲明結構體類型的關鍵字。大括號內是結構體中全部的成員,由它們組成一個特定結構體。每一個成員也稱爲結構體中的一個域,所以成員表又稱域表。
結構體相當於一個模型,不佔用存儲空間。
本文件需要用到某個結構體類型時,可以用#include指令將包含結構體聲明的文件包含到本文件中。如: #include <file1.cpp>
1)結構體變量初始化
2)引用結構體變量
1. 賦值
2. 引用變量的成員
“.”爲成員運算符,在所有運算符中優先級最高。
變量的成員只能單獨輸入或者輸出,但可以同時賦值。
3)結構體數組
4)指向結構體變量的指針
5)鏈表
鏈表是一種常見的數據結構。在結構體中,將下一個結點的地址放到前一個結點的成員next(命名習慣)中,這樣可以方便產生一系列的變量(對象)。
例如:
#include <iostream>
using namespace std;
struct Student
{
int num;
Student * next; /*next符合命名習慣*/
};
int main()
{
Student a,b,c,* head,* p; /*head符合命名習慣*/
a.num = 1001;b.num = 1002;c.num = 1003;
head =&a;
a.next = &b;b.next = &c;c.next = NULL;
p = head;
do
{
cout<<p->num<<endl;
p = p->next;
} while(p != NULL);
return 0;
}
6)用結構體變量的引用作函數參數(效率最高的傳遞方式)
#include <iostream>
using namespace std;
struct Student
{
int num;
};
void print(Student &);
int main()
{
Student a = {1001};
print(a);
return 0;
}
void print(Student & stu)
{
cout<<stu.num<<endl;
}
7)動態分配和撤銷存儲空間
C++提供了new和delete運算符來動態分配和撤銷空間,使用方式如下:
//開闢一個存放整數的存儲空間,返回一個指向該空間的地址(指針)
new int;
//開闢一個存放整數的空間,並賦初值爲100,之後將該空間的地址賦給指針變量
int *p = new int(100);
//開闢一個存放長度爲10的字符數組的空間,並將數組首元素的地址賦給指針變量
char *p = new char[10];
//撤銷變量的空間
delete p;
//撤銷數組的空間
delete [ ] p;
例子:
int main()
{
Student * p;
p = new Student;
p->num = 1001;
cout<<p->num<<endl;
delete p;
return 0;
}
枚舉類型
所謂“枚舉”是指將變量的值一一列舉出來,變量的值只能在列舉的值域裏面取。
聲明枚舉類型用enum開頭。例如:
enum weekday {sun,mon,tue,wed,thu,fri,sat};
花括號中的元素稱爲枚舉元素或枚舉常量。
聲明瞭枚舉類型後就可以用它來定義變量。
weekday workday,weekend;
當然,我們也可以在聲明枚舉類型的同時定義變量,也可以在定義變量的同時賦初值。
需要注意的是,枚舉元素作爲常量是有值的。編譯系統默認將枚舉元素按順序從0開始往後賦值。如執行語句
workday = mon;cout<<workday;
輸出的結果將會是1,而不是字符串mon。
除此之外,我們還可以把枚舉元素賦給整型變量。
先對整型變量(順序號)進行處理,再利用強制類型轉換處理枚舉類型變量。
雖然可以在聲明枚舉類型時指定枚舉元素的值,但是這樣書寫會比較混亂,不建議。
枚舉值可以按整數比較規則比較大小,且排列在前的枚舉元素大於後面的枚舉元素。如:
if(workday == mon) { }
在上例中,雖然workday的值是一個整數,但我們並不能將一個整數直接賦給workday,需要用到強制類型轉換:
workday = weekday(1);
作用是將weekday中順序號爲1的枚舉元素賦給workday,相當於
workday = mon;
用typedef聲明新的類型名
1)用typedef聲明一個新的類型名來代替已有的類型名
如:
typedef int INTEGER;
typedef float REAL;
2)用typedef對一個結構體類型聲明新名字
如:
typedef struct
{
int num;
} NUMBER;
1. 聲明ARR爲一個包含100個元素的整型數組,並用ARR定義數組
typedef int ARR[100];
ARR a,b,c; //這樣定義會更加方便
2. 聲明STRING爲字符指針,並用STRING定義指針和指針數組
typedef char * STRING;
STRING c,s[10];
3. 聲明FUCP是函數指針,函數返回值爲整型。
typedef (* FUCP)();
FUCP p;