C ++运算符重载选项

时间:2016-03-04 10:12:40

标签: c++

我创建了一个Date类型,其中有3个int成员day_month_year_。 我已经为operator<<重载了Date,我不知道什么是最佳选择:我有一个名为ostream& showDate(ostream& os)的函数,定义如下:

std::ostream& Date::showDate(std::ostream& os) const {

    return os << day_ << '/' << month_ << '/' << year_ << std::endl;
}

operator<<称之为:

std::ostream& operator<<(std::ostream& os, const Date& d) {

    return d.showDate(os);
}

但还有另一种选择:

std::ostream& operator<<(std::ostream& os, const Date& d) {

   return os << d.getDay() << '/' << d.getMonth() << '/' << d.getYear() << std::endl;
}

什么是最佳选择?

2 个答案:

答案 0 :(得分:2)

第二个选项是最常用的方法,因此可能最具可读性(与常见模式匹配)。

它还有一个优点,Date类不必知道有关流的任何信息。 showDate成员函数引入了两个类之间的耦合,否则它们是独立的。

答案 1 :(得分:0)

对此的答案实际上是基于意见的。从技术上讲,任何选项都没有什么优势,因为它们在功能上是等效的(假设访问者的理智实现,适当的访问控制等)。

在你给出的三个功能相同的选择中,我倾向于第一个或第三个,因为除了{{1之外的任何其他函数通常不需要你的showDate()成员函数。 }}

至于第一个和第三个之间的选择,这实际上取决于operator<<()是否有意义直接访问类数据成员。如果成员是operator<<(),则可能没有理由优先选择其中一个。如果它们是public,则选择将取决于您的设计中private是否为operator<<()(即类的界面的一部分)是否有意义。

暂且不说:我不会在friend内传播std::endl。让班级用户决定换行和刷新是否合适。