// 下列代码输出什么?
#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;
}
相关文章
- c++重载operator的示例 非原创
- 怎么输出byte数组 java_详解Java中ByteArray字节数组的输入输出流的用法
- c++输入输出流
- 解决c++ cin,cout 输入输出效率低导致运行结果超时的问题
- 定义一个复数类Complex,重载运算符+,-,*,/,使之能用于复数的加、减、乘、除。运算符重载函数作为Complex类的成员函数。编程序,分别求两个复数之和、差、积和商。
- 【C++ 给出一批百分制成绩,要求输出对应的成绩等级A、B、C、D、E】
- 九九乘法表的各种输出形式(c++)
- c++输出字符数组乱码_C++字符编码问题探究和中文乱码的产生
- java手机进库程序:txt文件当做小型数据库实现增删改查,存储json数据到txt实体类的序列化和反序列化,修改txt中内容,Jackson操作,io流写入和输出
- 分数的创建、化简、四则运算与输出————附带C/C++实现代码和示例