每日一言
别让过去的遗憾绊住脚步,未来的路还很长。
构造函数的讲解
话不多说直接上代码
要注意我们构造函数要写在类的定义里,其名称要和类名一样,而且没有返回类型(像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;)。
如果类中定义了至少一个带参数的构造函数:
编译器不会自动生成默认构造函数,此时你必须显式提供参数来匹配已有的构造函数。否则会编译报错。