| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1486 人关注过本帖
标题:this指针作为临时对象的困惑
取消只看楼主 加入收藏
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:9 
this指针作为临时对象的困惑
#include<iostream>
using namespace std;
class Date
{
 int month,day,year;
public:
 Date(int m=0,int d=0,int y=0):month(m),day(d),yaer(y){}
 Date operator--(int);
 void display()
 {cout<<year<<" "<<month<<" "<<day<<endl;}
};
Date operator--(int)
{
  Date dt(*this);//等价于Date dt=*this语句,创建一个临时对象,然后调用拷贝构造函数
  month--;
if(month<=0)
{month+=12;--year;}
return dt;
}
void main()
{
  Date dt(12,18,2008);
  Date da;
  da=dt--;
  cout<<"da:";
  da.display();
  dt.display();
}
加颜色部分我不懂,在这里,this 指针怎么用?怎么创建一个临时对象?求解答
搜索更多相关主题的帖子: return public include display 
2013-06-07 00:15
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 2楼 rjsp
Date dt(*this)这个语句,应该没有创建一个临时对象吧?我怎么弄也弄不懂,如果真的需要创建临时对象的话,这个过程是怎么发生的?
因为这个this指针是一个系统变量,不能对其进行赋值操作,所以this指针只能指向一个对象,那么this指针能不能从中读取数据?如果能,前提说了不能对this指针进行赋值操作,那就要创建一个临时对象来储存this指针所读取出来的数据。但最后又回头想了想,这个语句怎么创建临时对象啊,this指针指向一个对象,进行赋值的时候自然会调用拷贝构造函数的呀,需要临时对象吗

思考赐予新生,时间在于定义
2013-06-07 11:44
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
对于那个临时对象的用法,我始终无法理解,百度找了一下,太泛了,没有我想要的答案,版主能不能就临时对象给我举几个简单的例子?

思考赐予新生,时间在于定义
2013-06-07 12:28
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 3楼 peach5460
dt是一个对象,不是变量吧?,对象与变量之间能划上等号吗

思考赐予新生,时间在于定义
2013-06-07 12:33
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
扯远了,回到原来的话题,按照各位所说的。总结为以下:
dt是一个临时变量,不是临时对象,不存在创建临时对象,调用拷贝构造函数。
说到这里,我只剩下那个*this不明白,不知道它是怎么运作的。莫不成就是——*this指针指向一个对象,
然后这个对象调用拷贝构造函数拷贝一份数据给dt,this的作用仅仅是表明指向一个对象吗????

思考赐予新生,时间在于定义
2013-06-07 13:04
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
说了那么久,我还是不确定this指针用来干嘛的,那个语句有没有实现了创建临时对象
如果有创建临时对象,谁起了作用?

思考赐予新生,时间在于定义
2013-06-07 13:52
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 15楼 TonyDeng
默认构造函数也许根据编译系统的不同而不同吧!
我曾经在vs2012上面写过带有缺省参数的构造函数,只要带有
缺省值的构造函数,就被编译器系统认为是默认构造函数了!
比如Date(int m=0,int d=0,int y=0)这样的带有缺省参数的构造函数
我可以在主函数体里面成功创建一个Date a,这种情况版主见过吗?

思考赐予新生,时间在于定义
2013-06-07 14:00
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 19楼 TonyDeng
那么,可以肯定的是,Date dt(*this)这个语句并没有创建临时对象,
this指针只是指向当前对象,然后就调用默认的复制构造函数将this指针所
指向的当前对象的数据拷贝一份给dt!
的确,有些时候,有些对象不能直接使用默认构造函数进行拷贝,要自己写一个拷贝构造函数,
那就是浅拷贝与深拷贝的问题了!

思考赐予新生,时间在于定义
2013-06-07 14:38
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
追问一个额外问题:对于临时对象,应该在哪些情况下使用到临时对象?
除了“当函数返回一个对象时,要创建一个临时对象来存放返回的对象”这种情况,还有其他什么情况??
1,当函数返回一个对象时,要创建一个临时对象来存放返回的对象(例子)
Student fn()
{
   //.....
Studnet ms("virgil")
reutnr ms;
}
int main()
{
  Student s;
  s=fn();
  return 0;
}
求版主给我列举一下其他情况下的使用临时对象的用法,如果有临时对象的概念以及例子,我就好理解了

思考赐予新生,时间在于定义
2013-06-07 23:28
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 22楼 peach5460
呃呃呃,就是怎么使用临时对象,什么情况下要用到临时对象

思考赐予新生,时间在于定义
2013-06-08 11:19
快速回复:this指针作为临时对象的困惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053682 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved