注册 登录
编程论坛 C++教室

请教一个构造函数和析构函数的问题

dorble 发布于 2013-12-03 16:42, 504 次点击
程序代码:

#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)这几种区别
8 回复
#2
rjsp2013-12-03 16:47
因为 拷贝构造函数 你没计数
#3
dorble2013-12-03 16:56
你是说按值传递的时候调用了拷贝构造函数没计数对吧
#4
blueskiner2013-12-03 17:25
编译器默认给了你一个拷贝构造函数。如果你没自己指定的话。A(const A& other)。
#5
blueskiner2013-12-03 17:30
程序代码:
#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;
}
#6
流年!2013-12-04 09:45
类对象每次进行值传递都会发生一次拷贝构造,你值传了两次,实参到形参和返回,所以会出现三次析构
#7
rjsp2013-12-04 10:11
分别解释下T fun(T &t),T& fun(T &&t)和T&& fun(T &&t)以及T fun(T &&t)这几种区别
------ 我昨晚记得回答过你,今天竟然没发现,可能是我没点击“发表回复”就关机了。
重回答一下:& 是引用,&& 是右值引用。信息量很大,不是一言两语能说清的,自己Google一下相关资料。
#8
dorble2013-12-04 14:26
看了你们几位的回答,我仔细琢磨了下,明白了一些,
(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;
#9
rjsp2013-12-04 15:11
回复 8楼 dorble
1. google 返回值优化(return value optimization,简称RVO)
2. 能编译是因为语法没错误;而逻辑不合理,编译器给你警告了呀

1