Chinaunix首页 | 论坛 | 博客

abc

  • 博客访问: 22623
  • 博文数量: 17
  • 博客积分: 765
  • 博客等级: 军士长
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-11 22:34
文章分类

全部博文(17)

文章存档

2010年(3)

2009年(14)

我的朋友
最近访客

分类: C/C++

2009-10-13 22:11:34

#include

using namespace std;

class C{
public:
C(int i):n(i){cout << "Construct C" << i << endl;}
C(const C& c){n = c.n; cout << "Construct _C" << c.n << endl;}
~C(){cout << "Destruct C" << n << endl;n=-1;}
C& operator= (const C& c){cout << "Copy from C" << c.n << " to " << "C" << n << endl; n = c.n;return *this;}

private:
int n;
};

C f(int i)
{
C c(i);
return c;
}

int main()
{
C c0(2);
c0 = f(1);
printf("next\n");
C c4(4);
c4 = c0.copy();
return 0;
}

在csdn上看到的一个讨论, 下面在vc2005上测试的结果.

看函数f, 如果返回的是一个对象的引用, 则应该c为静态变量, 因为在函数返回时c已经被释放了

如果返回的是对象, 函数f中, 编译器会调用拷贝构造函数创建一个对象tmp, 然后释放c. 然后把tmp返回, 调用=运算赋值给c0, 然后再释放tmp. 如果类C未实现拷贝构造函数, 则系统会返回c. 但此时c已经被释放. 所以程序会出错.

阅读(499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~