浅谈结构体构造函数用法

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);  
}

构造函数可以与其他函数一样传入参数,根据参数来进行初始化。在调用时必须在定义结构体类型的变量时同时传入参数,故不能定义为 s t u d e n t    a ; student\;a; studenta

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);
}

注意:在我们未定义构造函数的时候,系统会自动帮我们定义构造函数,此时的构造函数为空,没有参数也没有函数体,不执行任何操作。

  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值