C++里的转换函数问题,operator(),求大牛指导

shallyhanlu 2014-08-21 04:57:04
1 #include <iostream>
2 using namespace std;
3
4 class A
5 {
6 public:
7 operator int()
8 {
9 cout<<"[int]";
10 return 100;
11 }
12 };
13 int main ()
14 {
15 A a1;
16 int n=(int)a1;
17 cout<<"n="<<n<<endl;
18 cout<<"a1=";cout<<a1<<endl;
19 cout<<"a1="<<a1<<endl;
20 }

输出结果:
[int]n=100
a1=[int]100
[int]a1=100
语句18,19输出结果为什么不一样??按逻辑应该19与18一样呀!疑惑!
...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shallyhanlu 2014-08-21
  • 打赏
  • 举报
回复
想通啦,要一步一步执行,虽说说将[int]压入最后一个输出流的栈,但cout<<"[int]";本身也是一个独立的语句,故先执行它,所以最先输出[int],然后再按最后一个cout<<"a1="<<a1<<endl;的栈先后顺序输出。 多谢以上二楼
shallyhanlu 2014-08-21
  • 打赏
  • 举报
回复
二楼的师兄,不懂汇编哎,看起来还是不太懂,有人说cout是从右往左执行的,这样的话我觉得先push a1,也就是先push“[int]”后100,最后“a1”,是这样的吗
shallyhanlu 2014-08-21
  • 打赏
  • 举报
回复
一楼的师兄,那19行是怎么具体输出的呢
passion_wu128 2014-08-21
  • 打赏
  • 举报
回复
这个问题实际上是操作符参数与调用的顺序问题.看看19行的汇编码就一目了然了:

	cout<<"a1="<<a1<<endl;
009A1571  mov         esi,esp 
009A1573  mov         eax,dword ptr [__imp_std::endl (9AA33Ch)] 
009A1578  push        eax  
009A1579  lea         ecx,[a1] 
009A157C  call        A::operator int (9A101Eh) 
009A1581  mov         edi,esp 
009A1583  push        eax  
009A1584  push        offset string "a1=" (9A7800h) 
009A1589  mov         ecx,dword ptr [__imp_std::cout (9AA340h)] 
009A158F  push        ecx  
009A1590  call        std::operator<<<std::char_traits<char> > (9A1159h) 
009A1595  add         esp,8 
009A1598  mov         ecx,eax 
009A159A  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (9AA344h)] 
009A15A0  cmp         edi,esp 
009A15A2  call        @ILT+420(__RTC_CheckEsp) (9A11A9h) 
009A15A7  mov         ecx,eax 
009A15A9  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (9AA324h)] 
009A15AF  cmp         esi,esp 
009A15B1  call        @ILT+420(__RTC_CheckEsp) (9A11A9h) 
从汇编码看出,先取endl的地址,push进栈,然后计算a1的int值(这时候会输出"[int]"),push进栈,最后取“a1=”的地址并push进栈。 而调用《操作符的时候是从左到右调用的。
  • 打赏
  • 举报
回复
引用 楼主 u010273604 的回复:
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 operator int() 8 { 9 cout<<"[int]"; 10 return 100; 11 } 12 }; 13 int main () 14 { 15 A a1; 16 int n=(int)a1; 17 cout<<"n="<<n<<endl; 18 cout<<"a1=";cout<<a1<<endl; 19 cout<<"a1="<<a1<<endl; 20 } 输出结果: [int]n=100 a1=[int]100 [int]a1=100 语句18,19输出结果为什么不一样??按逻辑应该19与18一样呀!疑惑!
那不是废话吗?18 那是两个输出流 第一个流就输出了a1= 第二个流输出[int]100; 19 他就是一个输出流的。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧