首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-02-11 
??????????????请教一个C++基础问题:拷贝构造函数??????????????????请教一个C++基础问题:拷贝构造函数#in

??????????????请教一个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了

热点排行