c++拷贝构造函数 && 赋值语句

拷贝构造函数


  • 拷贝构造函数的定义:

同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或拷贝是完全可行的(以为他们具有同样的结构)。这个拷贝的过程只需要拷贝数据成员,而函数成员是公用的(只有一份拷贝)。因此,在建立对象时咳以用同类的另一个对象来初始化对象。这时所用的构造函数成为拷贝构造

  • 拷贝构造函数的特点:

类名与函数名相同
参数是自身类型的引用(如果用值进行传递,会在传递参数时因为是对象给对象传递,也会再次调用拷贝构造,从而形成死循环,不停的调用拷贝构造函数)

  • 系统默认的拷贝构造函数

也称为缺省的按成员语义支持的拷贝构造函数,对象的每个成员被依次拷贝,也称之为缺省的按成员初始化。按成员做拷贝是通过依次拷贝每个数据成员实现的,而不是对整个类按位拷贝。

#include<iostream>
using namespace std;

class Test
{
public:
    Test(int data=0)
    {
        this->data=data;
    }
    Test(const Test &t)   //拷贝构造,加const是为了保护对象t不被修改
    {
        data=t.data;   //成员给成员赋值
    }
private:
    int data;
};

void main()
{
    Test t(8);
    Test t1(t);   //等价于Test t1=t;用已有对象初始化新对象调用拷贝构造函数
}

调用构造函数的时机:
1.用已有对象来初始化新对象(必须在新对象定义的同时完成初始化)
2.当函数的形参是类对象时,在调用该函数时使用。这时要在内存中新建一个局部对象,并把实参拷贝到新的对象中。
3.当函数的返回值是类对象时,函数执行完成返回着时使用。其仍然会建立一个临时对象
由于局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,因此在处理这种情况时,编译器会在调用函数的表达式中创建一个无名的临时对象,该临时对象的生存周期只在函数调用处的表达式中。所谓return对象,实际上是调用拷贝构造函数吧该对象的值拷入临时对象。如果返回值为变量,处理过程类似,只是不调用拷贝构造函数

赋值语句


  • 赋值语句的定义:

对象给对象赋值(此时的两个对象均为已有对象,即已经被声明过)

  • 赋值语句的特点:

重载=
返回值为类名的&,(避免出现连=现象:t=t1=t2,若返回值为void,则无法进行连=赋值)
形参为类名的&

#include<iostream>
using namespace std;

class Test
{
public:
    Test(int data=0)
    {
        this->data=data;
    }
    Test(const Test &t)
    {
        data=t.data;
    }
    Test& operator=(const Test &t)//赋值语句
    {
        if(this!=&t)   //判断是否是自己给自己赋值,必须判断
            data=t.data;
        return *this;   //*this代表当前对象,this代表当前对象的地址
    }
private:
    int data;
};

void main()
{
    Test t(8);
    Test t1;
    t=t1;  //t与t1均为已有对象,用已有对象给已有对象赋值,调用赋值语句
}

实验代码调结果:最终将t1的data的0值赋给了t的data值
这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值