有一个打印语句的函数是一种糟糕的编程实践吗

Is it bad programming practice to have a function that prints statement?

本文关键字:一种 编程 语句 打印 函数 有一个      更新时间:2023-10-16

我想知道,如果一个类的函数只将输出打印到屏幕上,这是否是一种糟糕的编程实践?

理解目的的简单示例: 学生类有常用的set和get方法,但它也有一个名为void PrintStudentDetails();的函数

应该这样做吗:

cout << "Name: " << student.GetName() << endl;
cout << "Age: " << student.GetAge() << endl;
cout << "Gender: " << student.GetGender() << endl;

或者作为调用打印函数的对象,主要如下:

student.PrintStudentDetails();

请告诉我正确的编码方法。

短版本

重载插入运算符。

TL;DR版本

虽然只写入cout的函数没有什么害处,但它比可以写入任何ostream的函数有用得多,也不难写入。

void Student::PrintStudentDetails(std::ostream & out) // pass in any out stream
{
out << "Name: " << student.GetName() << 'n'
<< "Age: " << student.GetAge() << 'n'
<< "Gender: " << student.GetGender() << 'n';
}

注意:插入运算符可以连锁。

旁注:std::endl是一个新行AND一个流刷新,该流刷新可能非常昂贵。通常,只有当必须立即将信息推送到客户端或流的缓冲区已满时,才需要刷新。在大多数其他情况下,更喜欢使用'n'endl

编写一个<<重载来打印您的类,这样您就可以使用anystream << myClassInstance;了,这只会稍微困难一些。

std::ostream & operator<<(std::ostream & out, // any outstream
const Student & student) // the object to print
{
out << "Name: " << student.GetName() << 'n'
<< "Age: " << student.GetAge() << 'n'
<< "Gender: " << student.GetGender() << 'n';
return out; // this is the magic that allows chaining
}

您现在可以

cout << myStudent;

注意:插入运算符通常被实现为类的friend,以便提供对private变量的轻松访问。

有关重载运算符的更多智慧,请阅读运算符重载的基本规则和习惯用法是什么?

相关文章: