学习C++、QT---09(C++构造函数的讲解)

每日一言

        别让过去的遗憾绊住脚步,未来的路还很长。

构造函数的讲解

话不多说直接上代码

要注意我们构造函数要写在类的定义里,其名称要和类名一样,而且没有返回类型(像void这种也不需要)。语法为 类(){},也就是car(){}这个就是构造函数的写法,多写几遍就习惯了

构造函数必须在类里定义,语法是:类名() {} 或者 类名(参数列表) {}。

我们可以把构造函数分为无参构造函数和有参构造函数:

- 无参构造函数的形式是 Car() {}

- 有参构造函数的形式是 Car(string brand, int year) {}

在本次案例中,我们创建了一个无参的对象:

Car myCar; // 这会调用无参构造函数

需要强调的是,构造函数只会在对象创建时被调用一次。

当我们调用myCar.display()时,执行的是display()函数的代码,并不会再次触发构造函数。这句话反证上一句话

有参构造函数

看看这个就是我们的有参构造函数,那么我们可以知道了

意思就是无论你写多少个构造函数,不管你写有参的还是无参的,取决于你。你在创建对象的时候,哪一个构造函数被调用取决于 我们存不存在参数?你存多少个参数?都是有关的,所以他就会调用相关的一些参数的那个构造函数。

核心原则

构造函数的调用由对象创建时的参数决定,编译器会自动选择参数类型和数量最匹配的构造函数。无论类中定义了多少个构造函数(无参、有参、重载),每个对象创建时仅调用一个构造函数

构造函数在面向对象编程里好处多多,能从根本上保障对象 “好用、规范、可控”,核心优势体现在这些关键场景:

构造函数的优点是什么?

1. 强制初始化,让对象 “一出生就可用”

创建对象时,构造函数自动执行,能给成员变量赋初始值(比如给汽车类 name 设默认名、year 设默认年份 )。没有构造函数的话,成员变量可能是随机值(像未初始化的 int 可能是脏数据 ),用起来容易出问题。

2. 灵活定制对象 “开局状态”(参数化)

通过有参构造函数,创建对象时传不同参数,直接定制内部状态。比如 car("宝马",2026) ,一行代码就让对象有了专属属性,不用创建后再手动挨个赋值,高效又灵活。

3. 封装初始化细节,代码更简洁好维护

把对象初始化的逻辑(比如校验参数、分配资源)“藏” 在构造函数里,外部用的时候不用关心咋初始化的。比如构造函数里校验 year 必须是合理年份,调用者只需传参,不用重复写校验代码,降低耦合。

参数列表构造函数

这个的话我们就要记住写法即可

Car(string a, string b,string c): name(a),type(b),year(c){

内容块:

}

Tips:

如果类中没有定义任何构造函数
编译器会自动生成一个默认构造函数(无参数),允许你直接声明对象(如 Car myCar;)。

如果类中定义了至少一个带参数的构造函数
编译器不会自动生成默认构造函数,此时你必须显式提供参数来匹配已有的构造函数。否则会编译报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的涛涛同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值