小知识:
cin类型和cout类型→本质是一个对象→输入、输出流的对象,分别做输入、输出
-
cin类型→是istream类的对象(inputstream)
-
cout类型→是ostream类的对象(outstream)
流运算符 >> <<
-
<< >> 只能用友元函数的方式重载
-
=(赋值语句) () ->(指针指向运算符)[ ] 这些运算符只能采用类的成员函数形式重载
-
. .* ?:( 三目运算符) ::(作用域分辨符) 这些运算符不能被重载
class MM
{
public:
MM(string name = "", int age = 18) :name(name), age(age) {}
protected:
string name;
int age;
};
int main()
{
//创建一个对象 写一个类->想实现同样的效果,也需要做运算符重载
MM mm;
cin>>mm;
cout<<mm; //报错:没有与这些操作数匹配的<<运算符
}
小知识:
string本身也是一个类,为什么类的对象string str可以直接cout做输出呢?做输入输出自定义类型时string应该怎样做? 本质是类里面做流(运算符)重载
int main()
{
string str("i love you"); //做了运算符重载
cin>>str;
cout<<str;
}
流重载
-
只能用友元函数的方式重载→由于要改变另一个类(cin类)的对象
-
必须用引用,因为会修改 istream& in 这个对象,cin会修改mm也必须要传引用
-
重载函数可以在类中声明,类中实现&类外实现,返回值未知,可以先假设为void类型
friend void operator>>(istream& in,MM& mm);
输入流重载
class MM
{
public:
MM(string name = "", int age = 18) :name(name), age(age) {}
friend void operator>>(istream& in, MM& mm)
{
in >> mm.name >> mm.age;
}
protected:
string name;
int age;
};
int main()
{
MM mm;
cin >> mm;
return 0;
}
输出流重载
//做输出不需要修改形参,传不传引用都可以
friend void operator<<(ostream& out, MM& mm)
{
out << mm.name << "\t" << mm.age << endl;
}
int main()
{
MM mm;
cin >> mm; //void operator>>(istream& in,MM& mm)
cout << mm; //void operator<<(ostream& out,MM& mm)
return 0;
}
拓展:要输入2个怎么办?void类型的函数不能连续输入、输出→但是标准库的可以连续输入、输出:cin>>str>>num; 报错:void类型的表达式不能连续输入,由此推断表达式运行结束后返回的是一个流对象
解决方案:cin>>mm>>num; cin>>num返回cin对象(返回输入流对象),用cin替换cin>>num→cin>>num,从而做连续操作
返回值类型必须返回引用&,不返回引用是局部变量,局部变量不能当做运算符右值
class MM
{
public:
MM(string name = "", int age = 18) :name(name), age(age) {}
friend istream& operator>>(istream& in, MM& mm)
{
in >> mm.name >> mm.age;
return in; //返回流对象
}
friend ostream& operator<<(ostream& out, MM& mm)
{
//把数据放到流对象中去,流对象负责把数据做输出,一定会修改流对象,必须需要传&
out << mm.name << "\t" << mm.age << endl;
return out; //返回流对象
}
protected:
string name;
int age;
};
int main()
{
MM mm;
cin >> mm; //istream& operator>>(istream& in,MM& mm)
cout << mm; //ostream& operator<<(ostream& out,MM& mm)
return 0;
}
可以实现多次输入
int main()
{
string str;
MM mm;
cin>>str>>mm;
cout<<str<<endl<<mm;
return 0;
}