淺談結構體構造函數用法


1.構造函數的優勢

眾所周知,在結構體內部可以定義變量、函數等,但結構體內部的變量有一個特點:無法被初始化。因此我們需要初始化變量時可以通過函數實現。

struct student{
    string name;
    int score;
    void pre(){
        name="Tom";
        score=4;
    }
};
int main(){
    student a;
    a.pre();
    printf("%d\n",a.score);  
}

但每定義一個student類型的變量時,我們就需要調用pre函數一次,操作略為繁瑣。因此我們可以采用構造函數。

2.構造函數的寫法

構造函數是一類較為特別的成員函數,它必須先聲明在結構體的內部,其函數名與該結構體類型的名字一樣,如此處結構體類型名為student,則構造函數的名字便為student。另外,構造函數沒有返回值,不需要用戶調用(用戶也無法調用),而是在創建對象時自動執行

struct student{
    string name;
    int score;
    student(){
        name="Tom";
        score=6;
    }
};
int main(){
    student a;
    printf("%d\n",a.score);  
}

構造函數可以與其他函數一樣傳入參數,根據參數來進行初始化。在調用時必須在定義結構體類型的變量時同時傳入參數,故不能定義為\(student\;a;\)

struct student{
    string name;
    int score;
    student(string s,int val){
        name=s;
        score=val;
    }
};
int main(){
    student a("Tom",5);
    printf("%d\n",a.score);  
}

有時參數可以不是通過我們手工輸入,而是自動為其賦一個值作為參數,如下代碼:

struct student{
    string name;
    int score;
    student(string s,int val=4){
        name=s;
        score=val;
    }
};
int main(){
    student a("Tom");
    printf("%d\n",a.score);  
}

此處構造函數的val已經被我們賦值為4,故在定義時不需傳入val的參數。但如仍要傳入,則最后以我們傳入的參數為准,例:

struct student{
    string name;
    int score;
    student(string s,int val=4){
        name=s;
        score=val;
    }
};
int main(){
    student a("Tom",6);
    printf("%d\n",a.score); //輸出6 
}

3.構造函數的初始化列表

構造函數在給成員變量賦值時,可以不把賦值操作寫在函數體內部,而是把它們放到函數名與函數體之間,具體格式如下:

struct student{
    string name;
    int score;
    student(string s,int val):name(s),score(val){}
};
int main(){
    student a("Tom",6);
    printf("%d\n",a.score);  
}

在函數名之后用冒號引起,不同的成員變量之間用逗號隔開,每個成員變量用括號表示賦值。此種方法較為簡便,被較多人采用。

注:給成員變量賦值時賦值順序與構造函數中成員變量書寫的順序無關,而是與成員變量在結構體內被定義的順序有關

struct student{
    string name;
    int score1,score2;
    student(int val):score2(val),score1(score2){}
};
int main(){
    student a(6);
    printf("%d %d\n",a.score1,a.score2);  
    //輸出0 6
}

雖然在構造函數中score2的賦值操作寫在了score1之前,但實際進行中先進行score1的賦值操作,此時score2未被賦值,因此score1得到的值是隨機的。

4.構造函數的種類

構造函數的名稱全部相同,所以區分不同的構造函數只能依靠參數的種類、數目。

struct student{
    int val1,val2;
    string s;
    student(int x){
        val1=x;
    } 
    student(int x,int y){
        val1=x;
        val2=y;
    }
    student(string s1){
    	s=s1;
    }
};
int main(){
    student a(1),b(1,2);
    printf("%d\n",a.val1);
    printf("%d\n",b.val2);
}

注意:在我們未定義構造函數的時候,系統會自動幫我們定義構造函數,此時的構造函數為空,沒有參數也沒有函數體,不執行任何操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM