【C++】19.对象的构造(下)

两个特殊的构造函数:

无参构造函数 : 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空。

拷贝构造函数 : 当类中没有定义拷贝构造函数时,编译器默认提供一个构造函数,简单的进行成员变量的值复制

//(面试题)
Class  T 
{}; 

//这里面的其实里面有隐藏的构造函数和拷贝构造函数  

有一个概念要理清:

在没有任何构造函数的时候,编译器才会为我们提供构造函数(这里面拷贝构造函数也是构造函数

拷贝构造函数的参数: const  class_name&

Text(const  Text& T)

拷贝构造函数的意义:

1.拷贝构造函数是兼容C语言的初始化方式(会牵涉到拷贝构造函数)

2.初始化行为能够符号预期的逻辑(即两个是状态一样)

// C方式
int i = 10
int b = i;

// C++方式
Test t1;    
Test t2=t1;   
Test t2(t1)

 

 

深拷贝是深入到里面再去申请内存的操作。

 

物理状态:是指每个对象在内存中的值是否相同 。

逻辑状态:是指这个内存中占据的地址值是否相同。

#include <stdio.h>

class Test
{
private:
    int i;
    int j;
    int* p;
public:
    int getI()
    {
        return i;
    }
    int getJ()
    {
        return j;
    }
    int* getP()
    {
        return p;
    }
    /*
    Test(const Test& t)
    {
        i = t.i;
        j = t.j;
        p = new int;
        
        *p = *t.p;
    }
    */
    Test(int v)
    {
        i = 1;
        j = 2;
        p = new int;
        
        *p = v;
    }
    void free()
    {
        delete p;
    }
};

int main()
{
    Test t1(3);
   // Test  t2 = t1;
    Test t2(t1);
    
    printf("t1.i = %d, t1.j = %d, *t1.p = %d\n", t1.getI(), t1.getJ(), *t1.getP());
    printf("t2.i = %d, t2.j = %d, *t2.p = %d\n", t2.getI(), t2.getJ(), *t2.getP());
    
    t1.free();
    t2.free();
    
    return 0;
}

//如果没重写拷贝构造函数
//调用默认浅拷贝只是单纯的赋值,赋值之后两个类的在内存中状态是一样的

拷贝构造函数一般性原则:

自定义拷贝构造函数,必需需要实现深拷贝

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值