1. 程式人生 > >C語言練習 結構體的初始化

C語言練習 結構體的初始化

首先我們舉個例子。在

struct studentInfo {
    int id;
    char name[20];
}stu;
中,我們先定義一個studentInfo的結構體變數,然後對其中的元素逐一賦值。例如:
    //第一種方法
    stu.id = 1;
    stu.genger = 'M';
    //第二種方法
    scanf("%d %c",&stu.id, &stu.gender);

但這兩種方法都太麻煩。
接下來給大家介紹一種建構函式的方法,它直接定義在結構體中,不需要寫返回型別,且函式名與結構體名相同。其實每一個普通的結構體中,內部都自動生成了一個預設的建構函式“studentInfo(){}”(但是不可見的)。

struct studentInfo {
    int id;
    char gender;    //'F' or 'M'
    char name[20];
    //預設的建構函式
    studentInfo() {}
};
它看起來和C++中的類的建構函式十分相似。是的,接下來你也可以這麼來學習。這是一個空的建構函式,裡面沒有任何東西,他會初始化結構體中的變數,賦上預設引數。如果你不想按照系統預設的建構函式初始化引數,想要自己手動提供id和gender的初始化引數,只需要重寫建構函式就可以了。(注意:如果重寫了建構函式,就會自動覆蓋系統提供的預設建構函式,下次定義結構體的時候就必須按照自己寫的建構函式來定義結構體變數
)。
為了既可以按照自己寫的結構體的建構函式初始化結構體變數,也可以使用系統預設的結構體的建構函式初始化變數,那麼可以同時寫多個建構函式。把系統的預設建構函式和自己寫的建構函式都放在結構體裡面,就可使用這幾種不同的建構函式初始化結構體中的變數。具體用到的是哪一種,就要看你呼叫了哪個建構函式,因為每個建構函式的引數個數和型別不能完全相同,所以在建構函式中出入不同的引數時,系統就會去找和你傳入的引數型別和個數相同的建構函式。例如:
struct studentInfo {
    int id;
    char gender;    //'F' or 'M'
    char name[20];
    //預設的建構函式
    studentInfo() {}
    //只初始化gender的建構函式
    studentInfo(char _gender) {
        gender = _gender;
    }
    //同時初始化id和gender的建構函式
    studentInfo(int _id, char _gender) {
        id = _id;
        gender = _gender;
    }
};
最後是一個應用例項。其中結構體Point用於存放平面點的座標x,y。
#include <stdio.h>
#include <stdlib.h>

struct Point {
    int x, y;
    Point() {}      //不同初始化的定義結構體
    Point(int _x, int _y) {
        x = _x;
        y = _y;
    }
}pt[10];

int main()
{
   int num = 0;
   for(int i = 0; i <= 3; i++) {
    for(int j = 1; j <= 3; j++) {
        pt[num++] = Point(x,y);     //直接使用自己寫的建構函式
    }
   }

   for(int i = 0; i < num; i++) {
    printf("%d,%d\n", pt[i].x, pt[i].y);
   }
    return 0;
}