重载<<运算符,以及隐式的类型转换函数,能达到一样的效果吗?
隐式的类型转换函数,可以把对象转换为其他的类型;
比如下例,当使用cout<< 输出时,Student类隐式的转化为char* 类型,实现了直接输出的效果。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Student{
public:
Student(string inputName, int inputAge=0):name(inputName),age(inputAge){};
operator const char*(){
ostringstream os;
os << "Name : " << name << " + " << "Age : "<< age;
student = os.str();
return student.c_str();
}
private:
string name;
int age;
string student;
};
int main()
{
Student *s = new Student("eric");
//因为在构造函数里inputAge=0;所以在这里可以这样只初始化name;
cout << *s <<endl;
delete s;
return 0;
}
或者,如果我们把Student类转换为int:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Student{
public:
Student(string inputName, int inputAge=0):name(inputName),age(inputAge){};
operator const int(){
return age;
}
private:
string name;
int age;
string student;
};
int main()
{
Student s1("Cynthia", 30);//
cout<< s1+30 << endl;//输出:60
return 0;
}
重载<<流输出运算符是常见的方法:
#include <iostream>
using namespace std;
class Student
{
public:
Student(string inputName, int inputAge, char inputSex){
name = inputName;
age = inputAge;
sex = inputSex;
}
~Student(){
cout<<"destructor runs"<<endl;
}
friend ostream& operator<<(ostream& , Student&);
//友元函数 ,或者写在类外面,不能写出成员函数
private:
string name;
int age;
char sex;
};
ostream& operator <<(ostream& os, Student& s)
{
os << "student name:" + s.name <<"\nAge: "<<s.age <<"\nsex: "<<s.sex;
return os;
}
int main()
{
Student *s = new Student("Eric", 30, 'M');
cout<<*s<<endl;
delete s;
return 0;
}
/*
程序中重载了运算符<<,运算符重载函数中的形参os是ostream类对象的引用,形参名os是用户任意起的。
分析main函数中的: cout << *s <<endl;
运算符<<的左面是cout,前面已提到cout是ostream类对象。“<<”的右面是s,它是Student对象。
由于已将运算符“<< ”的重载函数声明为Complex类的友元函数,编译系统把 cout << *s解释为
operator<<(cout, *s)
即以cout和c3作为实参,调用下面的operator<<函数:
ostream& operator<<(ostream& os,Student& s)
{
<span style="white-space:pre"> </span>os << "student name:" + s.name <<"\nAge: "<<s.age <<"\nsex: "<<s.sex;
return os;
}
*/