C++ 入门06:类的进阶(构造函数的重载与拷贝构造函数)
往期回顾:
C++ 入门03:函数与作用域-CSDN博客
C++ 入门04:数组与字符串-CSDN博客
C++ 入门05:类和对象-CSDN博客
一、前言
在前面文章的学习中,我们了解了 C++ 的基本结构、变量、输入输出、控制结构、循环、函数、作用域、数组与字符串以及类和对象的基础知识。今天,我们将深入学习类的进阶内容,特别是构造函数的重载与拷贝构造函数。
二、类的进阶
2.1、 构造函数的重载
(1)什么是构造函数重载
构造函数的重载是面向对象编程中一个非常有用的特性,它允许在同一个类中定义多个构造函数,这些构造函数具有相同的名称(即与类名相同)但参数列表不同。参数列表的不同可以体现在参数的数量、类型或顺序上。这种设计允许开发者根据不同的初始化需求,以灵活的方式创建对象实例。
(2)为什么需要构造函数的重载?
-
提高代码灵活性:
构造函数的重载提供了一种灵活的方式来初始化对象。不同的构造函数可以处理不同的初始化场景,从而避免在单个构造函数中使用复杂的逻辑判断来决定如何根据提供的参数初始化对象。例如,一个Person类可能提供多个构造函数,一个接受名字和年龄,另一个只接受名字,还有一个无参构造函数用于创建默认状态的Person对象。
-
增强代码可读性:
通过为不同的初始化场景提供明确的构造函数,可以使得代码更加清晰易懂。调用者可以根据需要直接选择合适的构造函数来创建对象,而无需担心构造函数内部的复杂逻辑。
-
支持多种初始化方式:
在某些情况下,对象的初始化可能依赖于外部数据源或配置文件的内容。通过重载构造函数,可以设计不同的构造函数来接受不同的数据源或配置方式,从而使得类的使用更加灵活和通用。
-
提高类的可重用性:
通过重载构造函数,可以使得类更容易被其他类继承和使用。子类可以根据需要覆盖或扩展父类的构造函数,以提供额外的初始化逻辑或支持新的初始化场景。
-
符合设计原则:
构造函数的重载也符合面向对象设计中的一些基本原则,如单一职责原则和开闭原则。单一职责原则要求一个类只负责一件事情,通过重载构造函数,我们可以将初始化对象的不同方式分散到不同的构造函数中,从而使得每个构造函数都专注于一种特定的初始化场景。开闭原则则要求软件实体对扩展开放,对修改关闭。通过重载构造函数,我们可以在不修改现有代码的情况下添加新的初始化方式,从而符合开闭原则的要求。
示例:
#include using namespace std; class Car { public: string brand; string model; int year; // 默认构造函数 Car() { brand = "Unknown"; model = "Unknown"; year = 0; } // 带参数的构造函数 Car(string b, string m, int y) { brand = b; model = m; year = y; } // 只提供品牌和年份的构造函数 Car(string b, int y) { brand = b; model = "Unknown"; year = y; } void displayInfo() { cout