Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6220
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-19 16:49
文章分类
文章存档

2015年(1)

我的朋友
最近访客

分类: C/C++

2015-05-19 18:00:10


今天笔试遇到的题目,对象作为参数传。
错误理解为参数传递后构造副本,调用构造函数。

阅读了下面这篇博文才理解。
    引用:
     http://blog.csdn.net/tms_li/article/details/7765626
    “类对象做为函数参数时,是被存放在栈上的,不影响实参的数据。

    若未重写拷贝构造函数,类的其它构造函数将不会被调用。
    形参的数据是通过内存拷贝传递的。
    若重写了拷贝构造函数,拷贝构造函数将会在初始化形参时被调用,不再进行内存拷贝工作。”


原题目
请写输程序输出的内容。
#include "stdafx.h"
#include
using namespace std;

class A
{
public:
    A(){ ++m_Count; }
    ~A(){ --m_Count; Print(); }
    void Print()
    {
        cout << "m_Count = "<< m_Count << endl;
    }
private:
    static int m_Count;
};

int A::m_Count = 0;

A foo(A tempA)
{
    tempA.Print();
    
    return tempA;
}

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    a.Print();
    A b = foo(a);

    return 0;
}
输出:
m_Count = 1
m_Count = 1
m_Count = 0
m_Count = -1
m_Count = -2

改进
若要达到统计类实例化数量,应该重写拷贝构造函数。
A(A & other){ ++m_Count; }

重写拷贝构造函数后
输出
m_Count = 1
m_Count = 2
m_Count = 2
m_Count = 1
m_Count = 0



拷贝构造函数——引用百度百科
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);

阅读(2173) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~