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