📅  最后修改于: 2023-12-03 15:14:01.502000             🧑  作者: Mango
在C++中,类的构造函数可以接受不同类型和数量的参数,这些参数可以用于初始化对象的成员变量。本文将介绍类构造函数中使用变量参数的方式。
类的构造函数是创建对象时自动调用的函数,它用于初始化对象的成员变量。在C++中,构造函数可以有参数和无参数两种形式。如果定义了有参数的构造函数,那么创建对象时必须传入对应数量和类型的参数。
下面是一个简单的例子,定义了一个有参数的类构造函数:
#include <iostream>
using namespace std;
class Point {
public:
Point(int x, int y) {
this->x = x;
this->y = y;
}
void print() {
cout << "x = " << x << ", y = " << y << endl;
}
private:
int x;
int y;
};
int main() {
Point p(3, 4);
p.print();
return 0;
}
在上面的例子中,Point类定义了一个有两个整型参数的构造函数。创建对象时,可以向构造函数传递x和y的值。p.print()输出的结果为:
x = 3, y = 4
有时候,我们想定义一个类,它的构造函数可以接受可变数量的参数。这时候可以使用变量参数。C++提供了两种方式实现变量参数,一种是使用C++11的initializer_list,另一种是使用可变参数模板。
使用initializer_list可实现构造函数接受可变数量的参数。下面是一个简单的例子:
#include <iostream>
#include <initializer_list>
using namespace std;
class Sum {
public:
Sum(initializer_list<int> list) {
sum = 0;
for (auto i = list.begin(); i != list.end(); ++i) {
sum += *i;
}
}
void print() {
cout << "sum = " << sum << endl;
}
private:
int sum;
};
int main() {
Sum s{1, 2, 3};
s.print();
return 0;
}
在上面的例子中,我们定义了一个类Sum,它的构造函数接受任意数量的int参数。创建对象时,我们可以使用花括号{1, 2, 3}来传递参数。s.print()的输出结果为:
sum = 6
使用可变参数模板可以定义类构造函数接受任意数量和类型的参数。下面是一个例子:
#include <iostream>
using namespace std;
class Sum {
public:
Sum() {
sum = 0;
}
template <typename... Args>
Sum(Args... args) {
sum = sum_all(args...);
}
void print() {
cout << "sum = " << sum << endl;
}
private:
template <typename T>
int sum_all(T t) {
return t;
}
template <typename T, typename... Args>
int sum_all(T t, Args... args) {
return t + sum_all(args...);
}
int sum;
};
int main() {
Sum s1{1, 2, 3};
s1.print();
Sum s2{"hello", 10, 'a'};
s2.print();
return 0;
}
在上面的例子中,我们定义了一个类Sum,它的构造函数接受任意数量和类型的参数。构造函数使用可变参数模板来实现。sum_all()函数使用递归的方式计算所有参数的和。s1.print()输出结果为:
sum = 6
s2.print()输出结果为:
sum = 119
上面的例子中,我们传递了三个参数{1, 2, 3}给构造函数,并传递了三个不同类型的参数{"hello", 10, 'a'}。建议谨慎使用这种方式,因为使用错误的参数类型和数量会导致编译时错误。
本文介绍了使用C++类构造函数变量参数的两种方式——initializer_list和可变参数模板。initializer_list适用于传递相同类型的参数,可变参数模板可以接受任意数量和类型的参数。