读书人

?请问一个C++基础有关问题:拷贝构造函

发布时间: 2012-02-11 09:51:34 作者: rapoo

??????????????请教一个C++基础问题:拷贝构造函数??????????????????
请教一个C++基础问题:拷贝构造函数

#include "stdafx.h "
#include <iostream.h>

class myclass
{
public:
myclass(int a, int b);
void pp(void);
myclass(const myclass &e);
~myclass();
private:
int m_a, m_b;
};

myclass::myclass(int a, int b)
{
cout < < "正常构造\n ";
m_a = a;
m_b = b;
}

myclass::myclass(const myclass &e)
{
cout < < "非正常构造\n ";
m_a = 5 + e.m_a;
m_b = 5 + e.m_b;
}

myclass::~myclass()
{
cout < < "析构\n ";
m_a = 0;
m_b = 0;
}

void myclass::pp()
{
cout < < m_a < < endl;
cout < < m_b < < endl;
}

myclass fun()
{
myclass ww(10,20);
return ww;
}

void main()
{
myclass ee = fun();

ee.pp();
}

以上是代码,现在有个问题:
按照书上说的,函数fun的过程应该是:
(1)先调用myclass类的构造函数,此时m_a=10, m_b = 20;
(2)把ww拷贝给一个临时变量,此时调用拷贝构造函数,此时m_a=15, m_b = 25;
(3)回到主函数,把临时变量拷贝给ee,又调用拷贝构造函数,此时m_a=20, m_b = 30;

上述过程在没有析构函数的情况下正常,但加上析构函数后,打印出来的m_a=15, m_b = 25; 发现比原来少了一个调用拷贝构造函数,这是怎么回事??谢谢

没有析构时:

正常构造
非正常构造
非正常构造
20
30

有析构时:

正常构造
非正常构造
析构
15
25
析构

[解决办法]
因为有一个名词叫“优化”
只要构造函数的总次数和析构函数的次数相同就可以。
没说一定要有那么多次构造/析构。
[解决办法]
lz google 返回值优化
[解决办法]
没什么问题
myclass ee = fun();//理论上在此处调用赋值拷贝构造函数
实际上并非如此,在VS2005下:
有析构时:
正常构造
10
20
析构
请按任意键继续. . .
没有析构时:
正常构造
10
20
请按任意键继续. . .

在fun()返回时进行了优化,在赋值时也没有调用拷贝构造函数,
而只是简单的赋值,将对象拷贝给ee了

读书人网 >C++

热点推荐