首页 > 编程语言 >C++拷贝构造、赋值函数

C++拷贝构造、赋值函数

时间:2023-08-24 20:35:26浏览次数:50  
标签:内存 t2 构造 C++ 拷贝 赋值 指针

拷贝构造

拷贝构造就是一种特殊版本的构造函数,

  • 格式:

     类名(const 类名& that)
      {
         //执行给每个成员变量进行赋值
      }
    
  • 什么时候会调用拷贝构造:

当使用旧对象(已new的)给新对象(新new的)初始化时,会自动调用拷贝构造

    Test t1;    //调用无参构造
    Test t2=t1;    //调用拷贝构造
    Test t3(t2);    //调用拷贝构造
  • 拷贝构造的任务:

负责把旧对象中的成员变量拷贝给新对象,并且编译器默认已经自动生成具有该功能的拷贝构造函数

  • 什么时候要显示地写拷贝构造函数?(深拷贝)

普通情况下,编译器自动生成的拷贝构造函数完全够用,但当类中有成员是指针类型且为该指针成员分配了堆内存,使用默认自动生成的拷贝构造只会对指针的值进行拷贝,此时会导致两个对象的 指针成员指向同一块内存,所以在执行析构函数时会造成重复释放错误,此时应该显示地实现拷贝构造

  • 浅拷贝和深拷贝:

浅拷贝:当类中成员有指针且分配了堆内存,只拷贝指针变量的(直接赋值=)

深拷贝:不拷贝指针变量的值,而是拷贝指针变量所指向的内存的内容(strcpy)

赋值函数(拷贝赋值、赋值运算符函数)

任务:用一个旧对象给另一个旧对象赋值(两个对象都已经完全创建)

Test t1,t2;    //无参构造
t1 = t2;    //调用赋值操作函数    //t1=t2=t3; t3赋值给t2,返回值为t2,再将t2赋值给t1
类名& operator=(const 类名& that);
    {

    }

!: 在C++中会把运算符当作函数处理,使用运算符时会调用运算符函数

  • 什么时候要显示地写赋值操作函数?

普通情况一般不需要显式地写赋值操作

类似于写显式拷贝构造,当需要进行深拷贝时,就需要显式地写拷贝构造和赋值操作

  • 实现赋值操作函数需要注意的问题:

虽然赋值操作雨与拷贝构造的任务相同,都需要深拷贝,但是坏境不同(旧对象、新对象)

1、问题1:被赋值的对象的指针已经分配有内存

①、先释放被赋值的指针指向的原内存

②、根据赋值者的赋值重新申请新内存

③、把赋值者内存的内容深拷贝到新内存中

2、问题2:可能会出现对象自己给自己赋值的情况

通过判断this指针与赋值者的地址是否相同,如果相同,立即返回this结束,如果不同,才进行赋值操作

标签:内存,t2,构造,C++,拷贝,赋值,指针
From: https://www.cnblogs.com/ljf-0804/p/17655090.html

相关文章

  • C++this指针、常函数
    this指针this指针的类型:类类型*const。不能被修改和赋值。只能在成员函数的内部使用。全局函数、静态函数都不能使用this.this指针本质上其实是一个成员函数的形参(栈),是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。this指针是成......
  • C++静态成员和单例模式
    一、静态成员Ⅰ.什么是静态成员:被static修饰的成员变量和成员函数就叫静态成员Ⅱ.普通成员的特点:成员变量:每个类对象中都有一份属于自己的成员变量,相互之间没有关联、独立的成员函数:隐藏着一个this指针,接收调用者的地址用于区分调用者Ⅲ.静态成员的特点:静态成员变......
  • C++对象的创建和销毁过程分析
    对象的创建和销毁过程分析1、对象的创建过程①给对象划分内存空间(栈、堆)②执行初始化列表根据继承表的顺序调用父类的无参构造或有参构造通过:父类(val)调用父类的有参构造根据成员变量的定义顺序调用类类型成员的无参构造或有参构造通过:类类型成员名(val)调用类类型成员......
  • C++面向对象、类和对象、访问控制限定符
    面向对象和面向过程面向过程:关注如何解决问题,以及解决问题的步骤面向对象:关注的解决问题的"人"即"对象",以及实现能解决问题的"对象"注意:面向对象的细节的本质上还是面向过程,因此面向对象不是解决问题的捷径,而是以更高的维度去思考问题面向对象的四个特性:抽象:先找出(想象)......
  • Windows中通过C++自动添加防火墙例外规则
    在C++程序中无法直接控制防火墙警报窗口的显示,因为这是由操作系统和防火墙软件控制的。防火墙警报窗口是为了提醒用户程序正在尝试与外部网络进行通信,以确保用户意识到可能的网络活动。然而,可以通过编写C++程序在用户的系统上自动添加防火墙例外规则,从而避免防火墙警报窗口的显示......
  • java bean赋值工具类
    javabean赋值工具类实现接收的bean赋值,判断有没有对应值的get、set方法,有就赋值。publicstatic<T>voidprint(Tbean){Class<?>fromClass=bean.getClass();Method[]toClassMethods=fromClass.getMethods();//遍历to含有的方法for(Methodmethod:toCla......
  • C++构造函数、析构函数、初始化列表
    构造函数构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化任务:一般负责对类对象进行初始化、资源分配class类名{int*p;public:类名(参数){p=newint;}}......
  • C++内联函数、引用、强制类型转换
    三、内联函数inline1、普通函数普通函数会被编译成二进制指令存储在代码段中,调用语句会生成一条跳转指令,当程序运行到调用语句时,会跳转该函数在代码段中对应的位置执行,执行结束会返回2、什么是内联函数内联函数也会被翻译成二进制指令,但调用语句不会生成跳转指令,而是直接把内......
  • 在Windows系统中搭建C++刷算法题环境
    下载Docker首先,到Docker官方网站下载适合Windows系统的DockerDesktop并安装。下载Ubuntu镜像使用如下命令安装Ubuntu最新镜像:dockerpullubuntu在镜像中搭建C++编译环境使用如下命令启动一个ubuntu容器:dockerrun-itd--nameubt-cpp-v/d/code/algo:/dataubuntu使......
  • Java的深拷贝与浅拷贝的区别
    1、二者的区别浅拷贝:在拷贝一个对象时,对对象的基本数据类型的成员变量进行拷贝,但对引用类型的成员变量只进行引用的传递,并没有创建一个新的对象,当对引用类型的内容修改会影响被拷贝的对象。深拷贝:在拷贝一个对象时,除了对基本数据类型的成员变量进行拷贝,对引用类型的成员变量进行......