C++的重载流输出运算符-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

C++的重载流输出运算符

简介: // 下列代码输出什么? #include <iostream> #include <string> // typedef basic_ostream<char> ostream; class A { private:     int m1,m2; public:     A(int a, i.
// 下列代码输出什么?
#include <iostream>
#include <string>

// typedef basic_ostream<char> ostream;
class A
{
private:
    int m1,m2;

public:
    A(int a, int b) {
        m1=a;m2=b;
    }

    operator std::string() const { return "str"; }
    operator int() const { return 2018; }
};

int main()
{
    A a(1,2);
    std::cout << a;
    return 0;
};


答案是2018,
因为类basic_ostream有成员函数operator<<(int),
而没有成员函数operator<<(const std::string&),
优先调用同名的成员函数,故输出2018,相关源代码如下:

// 名字空间std中的全局函数
/usr/include/c++/4.8.2/bits/basic_string.h:
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_ostream<_CharT, _Traits>&
operator <<(basic_ostream<_CharT, _Traits>& __os,
            const basic_string<_CharT, _Traits, _Alloc>& __str)
{
    return __ostream_insert(__os, __str.data(), __str.size());
}

// 类basic_ostream的成员函数
//  std::cout为名字空间std中的类basic_ostream的一个实例
ostream:
__ostream_type& basic_ostream::operator<<(int __n);

// 下列代码有什么问题,如何修改?
#include <iostream>
#include <string>

class A
{
public:
    int m1,m2;

public:
    A(int a, int b) {
        m1=a;m2=b;
    }

    std::ostream& operator <<(std::ostream& os) {
        os << m1 << m2; return os;
    }
};

int main()
{
    A a(1,2);
    std::cout << a;
    return 0;
};

类basic_ostream没有成员函数“operator <<(const A&)”,
也不存在全局的:
operator <<(const basic_ostream&, const A&)
而只有左操作数是自己时才会调用成员重载操作符,
都不符合,所以语法错误。

有两种修改方式:
1) 将“std::cout << a”改成“a.operator <<(std::cout)”,
2) 或定义全局的:
std::ostream& operator<<(std::ostream& os, const A& a) {
    os << a.m1 << a.m2; return os;
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章