C++知識整理 - 類的引入
主要內容
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;