| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 504 人关注过本帖
标题:请教一个构造函数和析构函数的问题
只看楼主 加入收藏
dorble
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-14
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:8 
请教一个构造函数和析构函数的问题
程序代码:
#include <iostream>

using namespace std;

class A
{
public:
  A()
  {
      cout<<"创建了一个对象,现有"<<++num<<"个对象"<<endl;

  }
  ~A()
  {
      cout<<"销毁了一个对象,还剩"<<--num<<"个对象"<<endl;

  }
      static int num;
};
int A::num=0;
template<typename T>
T fun(T t)       //如果改成按引用T &fun(T &t){return t;}就调用一次构造和一次析构
{
    return t;
}
int main(void)
{
    A a;
    fun(a);
return 0;

 }

运行如下
图片附件: 游客没有浏览图片的权限,请 登录注册

就这样为什么只调用一次构造函数却连续调用了3次析构函数

另外如注释所写,能不能分别解释下T fun(T &t),T& fun(T &&t)和T&& fun(T &&t)以及T fun(T &&t)这几种区别
2013-12-03 16:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:4 
因为 拷贝构造函数 你没计数
2013-12-03 16:47
dorble
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-14
收藏
得分:0 
你是说按值传递的时候调用了拷贝构造函数没计数对吧
2013-12-03 16:56
blueskiner
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:227
专家分:707
注 册:2008-9-22
收藏
得分:4 
编译器默认给了你一个拷贝构造函数。如果你没自己指定的话。A(const A& other)。
2013-12-03 17:25
blueskiner
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:227
专家分:707
注 册:2008-9-22
收藏
得分:0 
程序代码:
#include <iostream>

using namespace std;

class A
{
public:
  A()
  {
      cout<<"创建了一个对象,现有"<<++num<<"个对象"<<endl;

  }
  A(const A& )
  {
      cout<<"拷贝了一个对象,现有"<<++num<<"个对象"<<endl;

  }
  ~A()
  {
      cout<<"销毁了一个对象,还剩"<<--num<<"个对象"<<endl;

  }
      static int num;
};
int A::num=0;
template<typename T>
T fun(T t)       //如果改成按引用T &fun(T &t){return t;}就调用一次构造和一次析构
{
    return t;
}
int main(void)
{
    A a;
    fun(a);
return 0;
}
2013-12-03 17:30
流年!
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:107
注 册:2013-11-7
收藏
得分:4 
类对象每次进行值传递都会发生一次拷贝构造,你值传了两次,实参到形参和返回,所以会出现三次析构
2013-12-04 09:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
分别解释下T fun(T &t),T& fun(T &&t)和T&& fun(T &&t)以及T fun(T &&t)这几种区别
------ 我昨晚记得回答过你,今天竟然没发现,可能是我没点击“发表回复”就关机了。
重回答一下:& 是引用,&& 是右值引用。信息量很大,不是一言两语能说清的,自己Google一下相关资料。
2013-12-04 10:11
dorble
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-14
收藏
得分:0 
看了你们几位的回答,我仔细琢磨了下,明白了一些,
(1.值传递进去要复制一次,值返回要复制一次,T fun(T t))
(2.引用进去不复制,但是返回值要复制一次T fun(T &t))
(3.引用进去返回引用没有复制T& fun(T &t))
还有几点疑问:
1. 当形参是右值引用时,返回值不管是右值引用,左值引用还是值返回都没有复制对象为什么
2. T& fun(T t)这样为啥能通过编译,(有警告)返回的引用如果是t的引用,t不是已经丢失了吗

以上函数体不变都是 return t;
2013-12-04 14:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 8楼 dorble
1. google 返回值优化(return value optimization,简称RVO)
2. 能编译是因为语法没错误;而逻辑不合理,编译器给你警告了呀

2013-12-04 15:11
快速回复:请教一个构造函数和析构函数的问题
数据加载中...
 
   



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

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