转换构造函数

转换构造函数

转换构造函数是一种特殊类型的构造函数,它可以使用一个参数来创建新对象。这允许我们使用一个表达式将一个类型隐式转换为另一个类型。它通常用于定义从一个类型到类类型的转换。

当我们有一个需要类类型的表达式时,而我们提供的是另一种类型(例如,基本类型或另一个类类型),编译器将查找一个只接受该类型作为参数的构造函数,并使用它来执行转换。

以下是一个C++示例,说明了转换构造函数的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>

class Fraction {
public:
// 转换构造函数: 从整数到Fraction的转换
Fraction(int num) : numerator(num), denominator(1) {
std::cout << "转换构造函数调用\n";
}

// 常规构造函数
Fraction(int num, int denom) : numerator(num), denominator(denom) {}

// 用于打印分数的函数
void print() const {
std::cout << numerator << '/' << denominator << '\n';
}

private:
int numerator;
int denominator;
};

int main() {
Fraction f1 = 5; // 调用转换构造函数
f1.print(); // 输出 5/1

Fraction f2 = Fraction(5); // 显式调用转换构造函数
f2.print(); // 输出 5/1

Fraction f3(3, 4); // 使用常规构造函数
f3.print(); // 输出 3/4

return 0;
}

此示例中的Fraction类具有一个接受整数作为参数的构造函数。当我们尝试将整数赋值给Fraction类型的对象时,此构造函数被调用,并执行所需的转换。

注意,转换构造函数可以非常方便,但也可能导致一些意外行为。如果不希望构造函数被用作隐式转换,可以通过在构造函数声明前添加explicit关键字来防止这种情况:

1
2
explicit Fraction(int num) : numerator(num), denominator(1) {}


添加explicit后,构造函数不会用于隐式转换,只能显式调用


转换构造函数
https://qiangsun89.github.io/2023/08/24/转换构造函数/
作者
Qiang Sun
发布于
2023年8月24日
许可协议