从一例子解析合成拷贝构造函数和拷贝构造函数

1:假定numbered是一个类,它有一个默认构造函数,能为每个对象生成一个唯一的序号,保存在名为mysn的数据成员中。假定numbered使用合成的拷贝构造函数成员,并给出如下函数:

void f(numbered s) { cout<<s.mysn<<endl; }

则下面代码输出什么内容?
numbered a,b = a, c = b;
f(a); f(b); f(c);
解析:如果不定义拷贝构造函数和拷贝赋值运算符,依赖合成的版本,则在拷贝构造和赋值时只会简单的复制成员,则在b=a,c=b的时候只会简单的复制mysn成员,则最后输出的是三个相同的序号,都是0。

首先给出代码,便于后面的分析。

#include<iostream>
using namespace std;

class numbered
{
    private:
        static int seq;
    public:
        numbered()
        {
            cout<<"调用了默认构造函数"<<endl;
            mysn=seq++;
        }
        //f(numbered s);
        int mysn;
};


int numbered::seq = 0;

void f(numbered s)
{
    cout<<s.mysn<<endl;
}


int main()
{
    numbered a,b=a,c=b;
    f(a);//这里调用了构造函数
    f(b);
    f(c);
    return 0;
}

从代码中可以看出,如果使用合成的版本,则只会复制a的编号。则最后结果都为0 ,运行结果为。
这里写图片描述

这里显示调用了默认构造函数是因为numbered a,则调用了默认构造函数,后面b=a,c=b是调用了合成的拷贝构造函数,所以输出为0

2:假定numbered定义了一个拷贝构造函数,能生成一个新的序号,这会改变上一题中调用的结果么?
首先上代码:

#include<iostream>
using namespace std;

class numbered
{
    private:
        static int seq;
    public:
        numbered()
        {
            cout<<"调用了默认构造函数"<<endl;
            mysn=seq++;
        }
        numbered(const numbered &s);
        //f(numbered s);
        int mysn;
};


int numbered::seq = 0;

numbered::numbered(const numbered &s)
{
    cout<<"我被调用了"<<endl;
    mysn = seq++;
}

void f(numbered s)
{
    cout<<s.mysn<<endl;
}


int main()
{
    numbered a,b=a,c=b;
    f(a);//这里调用了构造函数
    f(b);
    f(c);
    return 0;
}

运行结果:
这里写图片描述

这里第一个输出调用了默认构造函数是因为申明了一个a,b=a,c=b这里调用了拷贝构造函数,但是为什么又出现了一次调用了拷贝构造函数呢??因为调用f(a)的时候,因为f(numbered s),形参不是引用,所以要调用拷贝构造函数将a的值赋值给s,所以输出的值就是3 ,而不是0,同理得到4 5

3:如果参数f中的参数为const numbered &,结果将会怎样,代码为:

#include<iostream>
using namespace std;

class numbered
{
    private:
        static int seq;
    public:
        numbered()
        {
            cout<<"调用了默认构造函数"<<endl;
            mysn=seq++;
        }
        numbered(const numbered &s);
        //f(numbered s);
        int mysn;
};


int numbered::seq = 0;

numbered::numbered(const numbered &s)
{
    cout<<"调用了拷贝构造函数"<<endl;
    mysn = seq++;
}

void f(numbered &s)
{
    cout<<s.mysn<<endl;
}


int main()
{
    numbered a,b=a,c=b;
    f(a);//这里调用了构造函数
    f(b);
    f(c);
    return 0;
}

运行结果为:
这里写图片描述
这里为什么少了3次调用了拷贝构造函数呢??因为f里的参数是引用,所以不需要调用拷贝构造函数,故最后mysn的值为0,1,2。

相信解释了这些就可以理解合成拷贝构造函数和拷贝构造函数了。。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值