单参数
多参数
继续来看多参数,下面的例子中构造函数有两个参数:
cpp
#include <iostream>
class ClassA {
public:
ClassA(int num1, int num2)
: num1_{ num1 }
, num2_{ num2 }
{
std::cout << __FUNCSIG__ << std::endl;
}
void print() {
std::cout << "num1_:" << num1_ << std::endl;
std::cout << "num2_:" << num2_ << std::endl;
}
private:
int num1_;
int num2_;
};
void TestClassA(ClassA class_a) {
std::cout << __FUNCSIG__ << std::endl;
class_a.print();
}
int main() {
ClassA test_class_a2 = { 1, 2 };
TestClassA({ 1, 2 });
return 0;
}
在 ClassA test_class_a2 = { 1, 2 } 以及 TestClassA({ 1, 2 }) 中虽然使用了大括号列表初始化的写法,和直接传入单个整数的形式不同。编译器会自动把 {1,2} 这个初始化列表,隐式调用 ClassA 的双参数构造函数,创建出一个临时的 ClassA 对象。这种写法没有明确写出类名,仍然会导致代码可读性下降。因此,即使是多参数构造函数,为了禁止隐式转换、提升代码清晰度和安全性,仍然强烈建议加上 explicit 关键字。
cpp
explicit ClassA(int num1, int num2)
: num1_{ num1 }
, num2_{ num2 }
{
std::cout << __FUNCSIG__ << std::endl;
}
并显示转换:
cpp
ClassA test_class_a2 = ClassA{ 1, 2 };
TestClassA(ClassA{ 1, 2 });
带默认参数的多参数构造
两个参数,其中带有一个默认参数的例子:
cpp
#include <iostream>
class ClassA {
public:
ClassA(int num1, int num2 = 0)
: num1_{ num1 }
, num2_{ num2 }
{
std::cout << __FUNCSIG__ << std::endl;
}
void print() {
std::cout << "num1_:" << num1_ << std::endl;
std::cout << "num2_:" << num2_ << std::endl;
}
private:
int num1_;
int num2_;
};
void TestClassA(ClassA class_a) {
std::cout << __FUNCSIG__ << std::endl;
class_a.print();
}
int main() {
ClassA test_class_a2 = 1;
TestClassA(1);
return 0;
}
对于这种带有默认参数,只有第一个参数是非默认参数的情况,在调用时候从代码 TestClassA(1) 也很难判断是一个整形参数?还是创建了一个临时对象?因此,也需要在构造函数前加 explicit 关键字。
cpp
explicit ClassA(int num1, int num2 = 0)
: num1_{ num1 }
, num2_{ num2 }
{
std::cout << __FUNCSIG__ << std::endl;
}
并显示转换:
cpp
ClassA test_class_a2 = ClassA(1);
TestClassA(ClassA(1));