friend ostream& operator<<(ostream& os, const benstudent& b); friend istream& operator>>(istream& is, benstudent& b);什么意思
时间: 2024-04-01 12:32:54 浏览: 16
这两行代码定义了C++中的友元函数,用于输入和输出自定义类型benstudent的对象。第一个函数是输出运算符重载函数,它接受一个输出流对象和一个常量benstudent对象的引用,然后将这个对象写入输出流中,并返回输出流对象的引用。第二个函数是输入运算符重载函数,它接受一个输入流对象和一个benstudent对象的引用,然后从输入流中读取数据并将其存储到benstudent对象中,并返回输入流对象的引用。这两个函数允许我们使用标准的输入输出函数来处理benstudent对象,而不需要了解其内部实现细节。
相关问题
#include <iostream> #include <cstdio> #include <cstring> using namespace std; class STRING{ char* pstr; public: STRING(const char* s="");//已实现 ~STRING();//已实现 friend istream& operator>>(istream& in, STRING& s); friend ostream& operator<<(ostream& os, const STRING& s); }; int main() { STRING s; cin >> s; cout << s << endl; return 0; } /* 请在这里填写答案,,你只需要实现输入输出运算符(>>、<<)的重载即可 */
可以这样实现输入输出运算符的重载:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class STRING{
char* pstr;
public:
STRING(const char* s="");
~STRING();
friend istream& operator>>(istream& in, STRING& s);
friend ostream& operator<<(ostream& os, const STRING& s);
};
STRING::STRING(const char* s) {
pstr = new char[strlen(s)+1];
strcpy(pstr, s);
}
STRING::~STRING() {
delete []pstr;
}
istream& operator>>(istream& in, STRING& s) {
char buffer[1024];
in.getline(buffer, 1024);
s.pstr = new char[strlen(buffer)+1];
strcpy(s.pstr, buffer);
return in;
}
ostream& operator<<(ostream& os, const STRING& s) {
os << s.pstr;
return os;
}
int main() {
STRING s;
cin >> s;
cout << s << endl;
return 0;
}
```
在输入运算符中,我们使用`getline()`函数来读取输入的字符串,然后动态分配空间并将字符串拷贝到对象的数据成员中。
在输出运算符中,我们直接输出对象的数据成员。
注意,在使用动态分配空间时,需要在析构函数中释放空间。
Description 已知学生类(Student)和日期类(Date)声明如下: class Date { int m_year, m_month, m_day; public: Date(int y=2000,int m=1, int d=1); //初始化 friend istream& operator>>(istream &in, Date &date); friend ostream& operator<<(ostream &out,Date &date); }; class Student { int m_id{}; string m_name{}; Date m_birthday; public: Student(int id = 1001,string name="Li",int y=2000,int m=1,int d=1); friend istream& operator>>(istream &in, Student &s); friend ostream&operator<<(ostream &out, Student &s); }; 试实现上述两个类的定义,在主函数中定义学生对象,输入该学生信息,输出其默认信息和更新后的信息。 Input 学生的基本信息,格式见样例。 Output 先输出学生的默认信息,再输出更新后的信息。 Sample Input 1 1002 Wang 1999 6 18 Sample Output 1 1001 Li 2000/1/1 1002 Wang 1999/6/18 Hint 姓名不含空格。
以下是实现上述两个类的定义的代码:
```c++
#include <iostream>
#include <string>
using namespace std;
class Date {
private:
int m_year, m_month, m_day;
public:
Date(int y=2000, int m=1, int d=1) : m_year(y), m_month(m), m_day(d) {}
friend istream& operator>>(istream& in, Date& date);
friend ostream& operator<<(ostream& out, const Date& date);
};
istream& operator>>(istream& in, Date& date) {
in >> date.m_year >> date.m_month >> date.m_day;
return in;
}
ostream& operator<<(ostream& out, const Date& date) {
out << date.m_year << "/" << date.m_month << "/" << date.m_day;
return out;
}
class Student {
private:
int m_id;
string m_name;
Date m_birthday;
public:
Student(int id=1001, string name="Li", int y=2000, int m=1, int d=1)
: m_id(id), m_name(name), m_birthday(y, m, d) {}
friend istream& operator>>(istream& in, Student& s);
friend ostream& operator<<(ostream& out, const Student& s);
};
istream& operator>>(istream& in, Student& s) {
in >> s.m_id >> s.m_name >> s.m_birthday;
return in;
}
ostream& operator<<(ostream& out, const Student& s) {
out << s.m_id << " " << s.m_name << " " << s.m_birthday << endl;
return out;
}
int main() {
Student s;
cin >> s;
cout << s;
s = Student();
cin >> s;
cout << s;
return 0;
}
```
输入格式为:学生id 姓名 出生日期(年 月 日),例如:1002 Wang 1999 6 18
输出格式为:学生id 姓名 出生日期(年/月/日)
首先定义了 Date 类,包含了三个私有成员变量 m_year、m_month、m_day,以及一个构造函数和两个友元函数,分别用于输入和输出日期信息。
然后定义了 Student 类,包含了三个私有成员变量 m_id、m_name 和 m_birthday,其中 m_birthday 是一个 Date 类对象,表示学生的出生日期。同样定义了一个构造函数和两个友元函数,分别用于输入和输出学生信息。
在主函数中,先定义了一个默认的 Student 对象 s,并输出其默认信息。然后通过输入流重载运算符 >> 输入学生信息,输出更新后的学生信息。最后返回 0 表示程序运行结束。