📜  c++ 类构造函数变量参数 - C++ (1)

📅  最后修改于: 2023-12-03 15:14:01.502000             🧑  作者: Mango

C++类构造函数变量参数

在C++中,类的构造函数可以接受不同类型和数量的参数,这些参数可以用于初始化对象的成员变量。本文将介绍类构造函数中使用变量参数的方式。

1. 构造函数参数

类的构造函数是创建对象时自动调用的函数,它用于初始化对象的成员变量。在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
2. 变量参数

有时候,我们想定义一个类,它的构造函数可以接受可变数量的参数。这时候可以使用变量参数。C++提供了两种方式实现变量参数,一种是使用C++11的initializer_list,另一种是使用可变参数模板。

2.1. 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
2.2. 可变参数模板

使用可变参数模板可以定义类构造函数接受任意数量和类型的参数。下面是一个例子:

#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'}。建议谨慎使用这种方式,因为使用错误的参数类型和数量会导致编译时错误。

3. 总结

本文介绍了使用C++类构造函数变量参数的两种方式——initializer_list和可变参数模板。initializer_list适用于传递相同类型的参数,可变参数模板可以接受任意数量和类型的参数。