C++ - 参数化构造函数
In C++ 中,构造函数是特殊的成员函数,当对象被创建时会自动调用。有两种主要的构造函数类型:default constructor 和 parameterized constructor。
默认构造函数 是一个不接受任何参数或所有参数都有默认值的构造函数。
而 参数化构造函数 是一个接受一个或多个参数的构造函数,用于在创建对象时使用传递的特定值来初始化对象。
在本章中,我们将仅学习参数化构造函数。
C++ 参数化构造函数
C++ 参数化构造函数 是一个接受一个或多个参数的构造函数,用于在创建对象时使用特定值初始化对象。与不接受参数的默认构造函数不同,参数化构造函数接受一个或多个参数。
语法
以下是声明参数化构造函数的语法:
ClassName(parameters) {
// Initialization code
}
参数化构造函数示例
以下是 C++ 中参数化构造函数的示例:
#include <iostream>
using namespace std;
class MyClass {
public:
int a, b;
// 带两个参数的参数化构造函数
MyClass(int x, int y) {
a = x; // 用 x 的值初始化 'a'
b = y; // 用 y 的值初始化 'b'
cout << "Parameterized constructor called" << endl;
}
// 显示 'a' 和 'b' 值的方法
void display() {
cout << "a: " << a << ", b: " << b << endl;
}
};
int main() {
MyClass obj1(10, 20); // 调用带 10 和 20 的参数化构造函数
obj1.display(); // 输出: a: 10, b: 20
return 0;
}
输出
Parameterized constructor called a: 10, b: 20
解释
- 首先定义了一个名为 MyClass 的 class,包含两个 public 数据成员 a 和 b,类型为 int。
- 然后是一个参数化构造函数 MyClass(int x, int y),接受两个参数 (int x, int y),并在创建对象时用传递的值初始化 a 和 b。
- 当调用 MyClass obj1(10, 20) 时,会调用参数化构造函数。
- display() 方法将打印 a 和 b 的值。
多个参数化构造函数(构造函数重载)
C++ 中的构造函数重载或多个参数化构造函数,是一个允许在同一 class 中定义多个构造函数的概念,这些构造函数具有不同的参数列表,每个构造函数可以根据创建对象时传递的参数以不同的方式初始化对象。
关键点
- 相同的构造函数名称 − 所有重载的构造函数必须具有与 class 相同的名称。
- 不同的参数 − 构造函数必须具有不同数量或类型的参数。
- 灵活性 − 构造函数重载还提供了在对象初始化时的灵活性,允许同一 class 以各种方式实例化。
语法
以下是多个参数化构造函数的语法:
class ClassName {
public:
// 默认构造函数(无参数)
ClassName() {
// Initialization code
}
// 带一个参数的参数化构造函数
ClassName(Type1 param1) {
// 使用 param1 的初始化代码
}
// 带两个参数的参数化构造函数
ClassName(Type1 param1, Type2 param2) {
// 使用 param1 和 param2 的初始化代码
}
// 带三个参数的参数化构造函数
ClassName(Type1 param1, Type2 param2, Type3 param3) {
// 使用 param1、param2 和 param3 的初始化代码
}
};
带默认参数的带参构造函数
带默认参数的带参构造函数是一种构造函数,它允许用户为一个或多个参数提供默认值,这意味着在创建对象时,你可以传递值,或者让构造函数为缺失的参数使用默认值。
语法
以下是带默认参数的带参构造函数的语法:
class ClassName {
public:
// 带默认参数的构造函数
ClassName(type1 param1 = default_value1, type2 param2 = default_value2, ...) {
// 构造函数实现
}
};
使用带参构造函数的优势
带参构造函数提供了多种好处,使对象初始化更加灵活、简洁和高效。下面我们讨论了一些关键优势。
- 它允许灵活的对象初始化,简化代码,提高可读性和可维护性。
- 它防止使用无效数据创建对象,只允许有效数据。
- 它减少了对 setter 函数的需求,并支持构造函数重载。
- 它还提供了更好的内存管理(使用动态内存分配),强制为缺失参数使用默认值,并整体提升代码性能。