Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988577
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-23 16:36:40

#include <iostream>
using namespace std;

struct A
{
    A() 
{ cout << "A()" << endl; }
    
//A( const A& ) { cout << "A(A)" << endl ;}
    A& operator=const A&  ) { cout << "A=A" << endl; }
    
~A() { cout << "~A()" << endl; }
}
;

A foo( A a )
{
    cout 
<< "---" << endl;
    
return a;
}


int main(void)
{
    
{
        foo( A() );
    }


    system( 
"pause" );
    
return 0 ;
}


在 VC++2005 下输出为:
A()
---
~A()
~A()
~A()

为什么 return a; 会调用2次析构函数?


---------------------------------- 简化一下----------------------------------
#include
using namespace std;

struct A
{
    A() { cout << "A()" << endl; }
    //A( const A& ) { cout << "A(A)" << endl ;}
    A& operator=( const A&  ) { cout << "A=A" << endl; }
    ~A() { cout << "~A()" << endl; }
};

void foo( A a )
{
}

int main(void)
{
    {
        foo( A() );
    }

    system( "pause" );
    return 0 ;
}

VS2005中的怪异现象描述:

如果没有 A( const A& ) { cout << "A(A)" << endl ;}
那么输出
A()
~A()
~A()

如果加上 A( const A& ) { cout << "A(A)" << endl ;}
那么输出
A()
~A()
阅读(3249) | 评论(20) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 16:40:15

carr
因为,你给函数的参数形式不一样。

foo( A() ); 直接产生一个栈局部对象,调用默认的构造函数。

而 A a; foo(a);  先产生一个对象a,再调用拷贝构造函数产生一个内部的对象。

就象  A a = A(); //总共只产生一个对象。

总之,C++语法,很黄很暴力

网友评论2012-11-23 16:40:07

周星星
写了拷贝构造函数 和 没写拷贝构造函数,其结果是不是应该一样?问题在于VC2005下不一样,前者出现2次析构函数,后者出现3次析构函数。

网友评论2012-11-23 16:39:59

carr123
因为产生了3个对象,其中一个是显式的,另两个是临时的。

对象1 :A()  
对象2: 因为A foo( A a )的参数不是引用,所以要产生一个栈内部的
对象
对象3: 因为foo( A a )的返回值不是引用,所以要产生一个临时的
对象

对象2和对象3是调用的拷贝构造函数,而你并没有写任何拷贝构造函数,
所以调用默认的。
注意:A& operator=( const A&  ) { cout << "A=A" << endl; }
是赋值函数,不是拷贝构造函数。
这样写试试:
A::A(A& a)
{
  cout<<"拷贝构造\n";
}

网友评论2012-11-23 16:39:50

esi
A()
---
~A()
~A()

gcc 3.2.3

网友评论2012-11-23 16:39:39

周星星
1。"拷贝构造函数会默认生成"的意思并不是说会生成一个 A( const A& ) { },而是说 不写出拷贝构造函数,那么 A b(a); 也能编译通过。

2。这我就不明白了,为什么“因此它们在类设计上行为本质就是不一致的”? 而且所谓“临时对象”在有无"拷贝构造函数"时有区别吗?