this相关问题

fang92 2014-11-26 05:16:32
我想请问一下 为什么在这个程序中,会输出No

#include<iostream>
using namespace std;
class Screen
{
private:
int date;
public:

Screen(){ date = 0; }
Screen up()
{
date++;
return *this;
}
int print(){ return date; }
Screen* print_p(){ return this; }
};
int main()
{
Screen text;
Screen *p;
p = &text;
if (p == text.up().print_p()) cout << "yes" << endl;
else cout << "No" << endl;

return 0;
}
...全文
346 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
farmliver 2014-11-30
  • 打赏
  • 举报
回复
引用 1 楼 ZHANGJIXIN 的回复:
#include<iostream>
 using namespace std;
 class Screen
 {
	 private:
	 int date;
	 public:

	 Screen()
	 {
		 date = 0; 
	 }
	 Screen* up()
	 {
		 date++;
		 return this;
	 }
	 int print(){ return date; }
	 Screen* print_p(){ return this; }
};
int main()
 {
	 Screen text;
	 Screen *p;
	 p = &text;
	 if (p == text.up()->print_p()) 
		 cout << "yes" << endl;
	 else
		 cout << "No" << endl;
	return 0;
 }
原因很简单,Screen up()中你返回*this,这一步会复制一个对象,这样在内存中就会存在两个不一样的对象,地址当然不会一样,如果照我上面的代码返回指针,就不会有这个问题
++
fang92 2014-11-29
  • 打赏
  • 举报
回复
你们的意思是在 p=text.up()这一步的话是*this先传给一个临时变量,然后再把这个临时变量传给P吗?
  • 打赏
  • 举报
回复
Screen& up() { date++; return *this; } 此处改为返回引用,如果返回Screen则创建是一个临时对象,将*this赋值临时对象,返回该对象,函数调用结束后销毁。
  • 打赏
  • 举报
回复
#include<iostream>
 using namespace std;
 class Screen
 {
	 private:
	 int date;
	 public:

	 Screen()
	 {
		 date = 0; 
	 }
	 Screen* up()
	 {
		 date++;
		 return this;
	 }
	 int print(){ return date; }
	 Screen* print_p(){ return this; }
};
int main()
 {
	 Screen text;
	 Screen *p;
	 p = &text;
	 if (p == text.up()->print_p()) 
		 cout << "yes" << endl;
	 else
		 cout << "No" << endl;
	return 0;
 }
原因很简单,Screen up()中你返回*this,这一步会复制一个对象,这样在内存中就会存在两个不一样的对象,地址当然不会一样,如果照我上面的代码返回指针,就不会有这个问题

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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