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;
}
相关文章
|
29天前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
27 1
|
1天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
9天前
|
C++
C++之运算符
C++之运算符
13 1
|
13天前
|
安全 程序员 C++
C++一分钟之-重载运算符
【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
17 2
|
16天前
|
C++
C++一分钟之-理解C++的运算符与表达式
【6月更文挑战第18C++的运算符和表达式构成了编程的基础,涉及数学计算、逻辑判断、对象操作和内存管理。算术、关系、逻辑、位、赋值运算符各有用途,如`+`、`-`做加减,`==`、`!=`做比较。理解运算符优先级和结合律至关重要。常见错误包括优先级混淆、整数除法截断、逻辑运算符误用和位运算误解。解决策略包括明确优先级、确保浮点数除法、正确使用逻辑运算符和谨慎进行位运算。通过实例代码学习,如 `(a &gt; b) ? &quot;greater&quot; : &quot;not greater&quot;`,能够帮助更好地理解和应用这些概念。掌握这些基础知识是编写高效、清晰C++代码的关键。
20 3
|
8天前
|
C++
C++函数的默认参数、占位符、重载
C++函数的默认参数、占位符、重载
15 0
|
9天前
|
Unix 编译器 C语言
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
8 0
|
2月前
|
C++
c++运算符
c++运算符
29 2
|
2月前
|
程序员 编译器 C++
c++重载运算符和重载函数
c++重载运算符和重载函数
26 1