拷贝构造函数(深拷贝+浅拷贝)

这篇具有很好参考价值的文章主要介绍了拷贝构造函数(深拷贝+浅拷贝)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

拷贝构造函数

拷贝构造函数:

Myclass(const Myclass& myclass)
{
     a=myclass.a;
     b=myclass.b;
     c=myclass.c;
}

浅拷贝

浅拷贝的思路就是和默认的拷贝构造函数一样: 即将原对象的值直接赋值给新对象,这样做一般情况下是没什么问题的,但是如果类的成员有指针,就会导致新对象中的指针和原对象中的指针指向的是一个地址.这样就会有若干风险存在

  • 对新对象中的指针内容修改时,原对象中的指针内容也会被修改
  • 对新对象析构后,再对原对象析构,就会导致对同一个地址释放释放两次.

深拷贝

拷贝构造函数(深拷贝+浅拷贝),c++

深拷贝的思路是,开辟新的空间,让新对象中的指针和原对象中的指针分别指向不同的空间.

所以说当类中有成员函数是指针的情况下,我们就不能使用浅拷贝,而应
当使用深拷贝.

使用深拷贝的例子:

class Myclass
{
     char *str;
     public:
     Myclass(const Myclass & myclass)
     {
          int n = strlen(myclass.str)+1;
	      str = new char[n];
	      strcpy(str,myclass.str);
     }
}

ps:
这里把语句str=new char[n],改成

str=new char;
str=new char();
str=new char[0];
..........

都是能正常编译且运行的,只不过编译器会给出警告,提示溢出缓冲区
另外strcpy这个函数在VS版本中已经因为不安全而被弃用了,如果想在VS中使用这个函数,需要加上

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

如果使用 strcpy_s版本开辟空间

Myclass(const Myclass & myclass)
     {
          int n = strlen(myclass.str)+1;
	      str = new char[n];
	      strcpy_s(str,n,myclass.str);
     }

缓冲区的大小=背复制的字符串的长度+1;
strcpy的安全版本:strcpy_s使用方法:
strcpy_s文章来源地址https://www.toymoban.com/news/detail-708427.html

到了这里,关于拷贝构造函数(深拷贝+浅拷贝)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ⚡【C++要笑着学】(7) 默认成员函数:构造函数 | 析构函数 | 拷贝构造函数

    🔥 订阅量破千的火热 C++ 教程 👉 火速订阅 《C++要笑着学》   🔥 CSDN 累计订阅量破千的火爆 C/C++ 教程的 2023 重制版,C 语言入门到实践的精品级趣味教程。 了解更多: 👉  \\\"不太正经\\\" 的专栏介绍  ← 试读第一章 订阅链接: 🔗 《C语言趣味教程》 ← 猛戳订阅!   本篇

    2024年02月07日
    浏览(67)
  • C++——拷贝构造函数

    (用旧对象去构造新对象) 拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。 参数的类型:   值类型(不行,会产生递归); 指针类型(能实现要求,但会出现歧义(感觉a的地址给b构造));

    2024年02月02日
    浏览(39)
  • c++(8.23)类,this指针,构造函数,析构函数,拷贝构造函数

    设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象 p1,设计这两个类的构造函数、析构函数和拷贝构造函数。

    2024年02月11日
    浏览(38)
  • C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造

    构造函数是 C++ 中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。 C++ 支持多种类型的构造函数,用于满足不同的初始化需求: 默认构造函数: 不带参数的构造函数,通常用于初始化

    2024年04月22日
    浏览(48)
  • 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )

    C++ 构造函数可以分为以下几类 : 无参构造函数 : 最简单也是默认的构造函数 , 函数没有参数 , 如果创建一个对象 , 没有传入参数 , 调用的就是该类型的 构造函数 ; 有参构造函数 : 带参数的 构造函数 , 创建 实例对象 时 , 为成员变量提供初始值 ; 拷贝构造函数 : 拷贝现有 实例

    2024年02月07日
    浏览(41)
  • 【C++技能树】类的六个成员函数Ⅰ --构造、析构、拷贝构造函数

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 在开始本章内容之前,先浅浅的了解一下this指针的概念.这对理解后面的内容有着很大的帮助. this指针 顾名思义就是这个指针,我们先来看看下面这段很简单的代码 首先创建了一个

    2024年02月02日
    浏览(53)
  • 【C++】构造函数,析构函数,拷贝构造,运算符重载,const 成员

    默认成员函数:如果不显示,编译器默认生成 构造函数:是一个特殊的 成员函数 ,函数名与类名相同,专门用于 初始化类对象 函数名与类名相同 无返回值 ,没有被声明为void类型 对象实例化时 编译器自动调用 , Date d1 ,或 Date d2(2023, 4, 21) 构造函数可以重载,一个类中可以

    2023年04月24日
    浏览(69)
  • 『C++成长记』拷贝构造函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、拷贝构造函数 📒1.1拷贝构造函数的概念 📒1.2拷贝构造函数的写法 📒1.3编译器生成的拷贝构造 📒1.4拷贝构造函数的用法 📒1.5拷贝构造函数典型调

    2024年02月04日
    浏览(41)
  • 【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数,赋值运算符重载

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗? 并不是 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 我们实现了,编译器就不会生成了 构造函数是

    2024年02月21日
    浏览(50)
  • 【C++学习】类和对象 | 拷贝构造 | 探索拷贝构造函数为什么需要引用传参 | 深拷贝 | 初识运算符重载

    上一篇文章我们开始学习类内的默认成员函数, 这里是传送门,有兴趣可以去看看:http://t.csdn.cn/iXdpH 这篇文章我们继续来学习类和对象的知识。 目录 写在前面: 1. 拷贝构造 2. 拷贝构造函数为什么需要引用传参? 3. 深拷贝 4. 初识运算符重载 写在最后: 我们在创建一个对

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包