Chinaunix首页 | 论坛 | 博客
  • 博客访问: 170425
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 22
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-17 17:44
个人简介

一入程序深似海,从此妹子成路人

文章分类

全部博文(67)

文章存档

2016年(13)

2015年(54)

我的朋友

分类: C/C++

2015-07-11 23:44:52


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

阅读了下面这篇博文才理解。
    引用:
     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) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);

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