转换运算符与给定类型的构造函数。哪个更好?

时间:2011-05-23 10:14:39

标签: c++ constructor

我正在为容器定义迭代器类型,当然我希望iterator可以转换为const_iterator。但我不确定哪个更好/更可取:

iterator

中的转换运算符
class iterator
{
    operator const_iterator();
};

const_iterator

中的非显式构造函数
class iterator
{
    // implementation
    friend class iterator; // hard to avoid this
};

class const_iterator
{
    const_iterator(iterator const &);
};

是否有更好的指导方针?

3 个答案:

答案 0 :(得分:1)

作为一般规则:

几乎 从不 提供隐式转化运算符; 首选 始终使用 转换构造函数 。使用隐式转换运算符,当您不期望并创建不必要的混淆时,很少会发现它们被调用。

转换构造函数 也是一种更好的方法,因为它可以让您遵循 Principle of least Astonishment

此规则的唯一常见例外是提供到布尔类型的转换,以便可以在布尔上下文中使用对象(例如,智能指针)。

答案 1 :(得分:1)

只有在可以在不构造新对象的情况下返回所需类型,或者返回是简单数据类型时,才应编写构造运算符。例如,如果要将const引用返回给类中的属性,则应将其写为转换运算符。

在所有其他情况下,您应该编写适当的构造函数。

答案 2 :(得分:0)

某些实现允许iterator继承const_iterator,并免费获得转化。