读书人

请问:C++重载输出操作符lt;lt;的有关问题,

发布时间: 2012-10-11 10:16:10 作者: rapoo

请教:C++重载输出操作符<<的问题, cout.operator()是什么东东?

问题来自我的一篇 学习博客 :
http://blog.csdn.net/sergery/article/details/8043203


问题1:cout.operator <<() 该怎么用?

C/C++ code
#include <iostream>#include <string>using namespace std;void main(){   cout.operator <<("csdn"); // 0046E01,是个地址? 为什么不是输出字符串"csdn"?}



问题2: 下面的代码,重载了"<<", 那么 cout<<x1 能实现输出的具体调用形式是什么?
C/C++ code
#include <iostream>#include <string>using namespace std;class Student{public:    // 存    void setname(string s){    name = s;}    void setage(int y){age = y;    }    void setaddress(string add){address = add;}        // 取    string getname(){return name;}    int getage(){return age;}    string getaddress(){return address;}       Student(string name="",int age=0,string address="")    {        this->name = name; this->age = age; this->address = address;          }    ~Student(){}         //重载 运算符<< : 把 "operator<<" 看作是函数名, 返回类型是 ostream类型的对象引用    friend ostream& operator<< (ostream &os,Student &st)    {        os<<st.name<<"------"<<st.age<<"------"<<st.address<<endl;        return os;    }protected:    private:    string name;    int    age;    string address;};void main(){ Student x1("刘莉莉",22,"东风路369号");  cout<<x1; //cout<<x1 ---结果OK,问题是这个写法很怪,是谁在调用那个重载函数?,x1显然是个参数,那是cout调用的 operator<< ?            /*         "<<"  是个什么东东? C++ Prime P6        这是个 "输出操作符", 其左边是ostream对象cout,右边是要输出的值        它的操作返回输出流本身cout,也就是可以连续写的原因.       */      // 既然 cout是 ostream对象,那么可以用 . 的形式 访问ostream的成员函数      // 但是 operator<< 在本程序中已经重载了,要按照本程序的形参格式传入参数 ?       ostream z;       cout.operator<<(z,x1);  // 编译通不过...}


[解决办法]
第一个问题:
cout.operator<<("csdn")这样实际上调用的是ostream重载的成员方法operator<<(...),而ostream并没有针对char*类型的成员重载,所以输出整数。应该使用全局的二元重载operator<<来进行字符串输出
ostream& operator<<(ostream& os, char* str);
调用方法有二:方法一:操作符调用: cout<<"csdn";
方法二:函数调用:operator<<(cout,"csdn");

第二个问题:
和第一个问题一样,应该使用z<<x1,或者 operator<<(z,x1) 来调用即可

再次强调,cout.operator<<(...)实际上调用的是cout(即ostream)重载的成员方法,这里是操作符方法,而我们无法扩展ostream的实现,让它支持student的输出。但是可以通过定义全局重载的operator<<来输出。但是要使用全局的操作符,就不能使用cout.operator这种方法来调用
[解决办法]
格式化输出:
1. 成员函数: ostream::operator <<, 支持整数(不包括字符类型),浮点数,bool, const void*等。
2。全局函数: operator<<(ostream& os, T const&), 支持字符,字符串和自定义类型

理解下面的例子就明白怎么回事了

C/C++ code
#include <iostream>#include <iomanip>#include <sstream>int main(){    std::istringstream input(" \"Some text.\" ");    volatile int n = 42;    double f = 3.14;    bool b = true;;    std::cout << n   // int overload              << ' ' // non-member overload              << std::boolalpha << b // bool overload              << " " // non-member overload              << std::fixed << f // double overload              << input.rdbuf() // streambuf overload              << &n // bool overload              << std::endl; // function overload} 

读书人网 >C++

热点推荐