1

我目前正在计划一个具有一些转换功能的类。我只是想知道什么时候我必须重载一个类的演员。当我有一个转换构造函数A(B& b)然后据我看到,只要我需要将B转换为A,我可以只使用转换构造函数。我是否需要重载一个类的演员操作符?

例子:

B b, c, d; 
A a = b; // conversion constructor automatically called 
a = A(c); // could also overload assignment operator 
function_of_a((A)d); // can equally write this as function_of_a(A(d)) 

目前我打算只使用一个转换构造函数,而我没有看到重载转换运算符的任何目的,我也打算故意不超载为A = B赋值运算符使代码中的转换更加明显。

+0

请注意,您的转换构造函数不允许rvalues。 – chris

+1

转换构造函数是* destination *类型接口的一部分。 Cast操作符是* source *类型接口的一部分。有时您不能更改目标类型或不希望它对源类型有依赖关系。 –

+0

@chris:如果没有右值/移动构造函数存在,是不是会回退到正常的引用/复制构造函数? – Michael

回答

2

如果要转换为基元或无法访问的类型(例如,operator bool()operator std::string()),显然必须编写一个演员操作符。

除此之外,它主要是接口设计的问题。转换构造函数是目标类型接口的一部分。演员操作员是源类型界面的一部分。您需要确定转换应该属于哪个接口。

例如,假设您有一个fancy_string类,还有十几个其他类可以转换为fancy_string以生成fancy_string表示形式。 fancy_string是否应该包含所有这些类的转换构造函数?可能不会。这将使fancy_string依赖于所有这些类,并且每次添加应该可转换为fancy_string的类时,您也必须更改fancy_string。这是可怕的设计。在每个类中提供一个演员操作符会好得多,因为转换到某个类的能力应该是这些类的接口的一部分,而不是fancy_string

相关问题