【C++入门到精通】C++入门 —— 深浅拷贝函数

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

【C++入门到精通】C++入门 —— 深浅拷贝函数,C++,c++,开发语言

目录

拷贝函数

浅拷贝拷贝构造函数

深拷贝拷贝构造函数

总结


 前言

        前面我们学习了C++的一些基本的知识点,并且介绍了一些STL里面String的一些关键操作,除了这些博主还新开了一个专栏关于Linux的讲解(Linux专栏链接)大家可以关注一下,后面我会一点一点的更新的。大家坐稳扶好,要开车了!!!

拷贝函数

        在我们了解深浅拷贝之前博主简单介绍一下什么是拷贝构造函数,这里只是简单的介绍一下(拷贝构造详细介绍)

        是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始化新对象,实现对象的复制操作。通过定义拷贝构造函数,我们可以控制对象的拷贝过程,并确保正确处理含有指针或动态分配内存的类。

拷贝构造函数的定义形式如下:

类名(const 类名& 对象名)
{
    // 构造函数的主体部分
    // 将对象的属性值拷贝到新对象
}


         拷贝构造函数的特点:拷贝构造函数在C++中具有自动调用、形参类型为const引用、逐一复制对象成员、隐式调用与显式调用、需要自定义情况等特点

浅拷贝拷贝构造函数

        浅拷贝是指简单地将一个对象的数据成员的值复制到另一个对象中,这包括基本数据类型和指针。在浅拷贝中,指针只复制了地址,而没有复制指针指向的数据

下面我用一个简单的代码,说明C++中浅拷贝和拷贝构造函数的概念:

#include <iostream>

class MyClass {
public:
  int* data;

  // 默认构造函数
  MyClass() {
    data = new int(0);
    std::cout << "Default Constructor called" << std::endl;
  }

  // 拷贝构造函数
  MyClass(const MyClass& obj) {
    data = new int(*(obj.data));
    std::cout << "Copy Constructor called" << std::endl;
  }

  // 析构函数
  ~MyClass() {
    delete data;
    std::cout << "Destructor called" << std::endl;
  }
};

int main() {
  // 创建对象a
  MyClass a;
  *(a.data) = 10;

  // 使用拷贝构造函数创建对象b
  MyClass b(a);

  // 修改对象b的值
  *(b.data) = 20;

  // 输出结果
  std::cout << "a.data: " << *(a.data) << std::endl;
  std::cout << "b.data: " << *(b.data) << std::endl;

  return 0;
}

输出结果为:

Default Constructor called
Copy Constructor called
a.data: 10
b.data: 20
Destructor called
Destructor called

        在上面的代码中,我们定义了一个名为 MyClass 的类,其中包含一个 int 类型的指针成员 data 。在默认构造函数中,我们创建了一个 data 指针,并将其初始化为0。在拷贝构造函数中,我们通过复制源对象的 data 指针的值来创建一个新的 data 指针。

main 函数中,我们首先创建一个对象 a 并将其 data 值设置为10。然后,我们使用拷贝构造函数创建了另一个对象 b ,并将其 data 值设置为与 a 相同的值。最后,我们分别输出了 a.datab.data 的值。

        需要注意的是,在拷贝构造函数中,我们需要手动为指针成员分配内存,并复制源对象指针的值。这是因为默认的浅拷贝只会复制指针的值,而不会创建新的内存空间。这可能会导致指向相同内存地址的多个指针,当其中一个指针释放内存时,其他指针也将失去引用的内存。因此,在处理包含指针成员的类时,通常需要实现拷贝构造函数,并进行深拷贝(复制指针指向的数据)。这样可以确保每个对象有一份独立的数据,避免潜在的内存管理问题。

深拷贝拷贝构造函数

        深拷贝是指在拷贝构造函数中创建一个新的对象,并复制源对象的所有数据成员包括指针指向的数据)。这样每个对象都拥有独立的内存空间,修改一个对象不会影响其他对象。

下面我用一个简单的代码,说明 C++ 中深拷贝和拷贝构造函数:

#include <iostream>
#include <cstring>

class MyClass {
public:
  char* data;

  // 默认构造函数
  MyClass() {
    data = new char[1];
    *data = '\0';
    std::cout << "Default Constructor called" << std::endl;
  }

  // 拷贝构造函数
  MyClass(const MyClass& obj) {
    data = new char[strlen(obj.data) + 1];
    strcpy(data, obj.data);
    std::cout << "Copy Constructor called" << std::endl;
  }

  // 析构函数
  ~MyClass() {
    delete[] data;
    std::cout << "Destructor called" << std::endl;
  }
};

int main() {
  // 创建对象a
  MyClass a;
  a.data = new char[5];
  strcpy(a.data, "Hello");

  // 使用拷贝构造函数创建对象b
  MyClass b(a);

  // 修改对象b的值
  delete[] b.data;
  b.data = new char[6];
  strcpy(b.data, "World");

  // 输出结果
  std::cout << "a.data: " << a.data << std::endl;
  std::cout << "b.data: " << b.data << std::endl;

  return 0;
}

输出结果为:

Default Constructor called
Copy Constructor called
a.data: Hello
b.data: World
Destructor called
Destructor called

        在上面的代码中,我们定义了一个名为  MyClass  的类,其中包含一个  char*  类型的指针成员  data 。在默认构造函数中,我们为  data  分配了一个字符指针,并将其初始化为空字符串。在拷贝构造函数中,我们先为  data  分配了足够的内存空间,然后使用  strcpy  函数复制源对象的字符串数据。

        在  main  函数中,我们首先创建一个对象  a  并为其  data  成员分配了足够的内存空间,并将其值设置为 "Hello"。然后,我们使用拷贝构造函数创建了另一个对象  b ,并将其  data  成员的值设置为与  a  相同的值。最后,我们修改了  b  的  data  值,确保每个对象都有独立的数据。

        需要注意的是,在拷贝构造函数中,我们需要手动为指针成员分配足够的内存空间,并复制源对象指针指向的数据。这样可以确保每个对象都有自己的独立副本。同时,在析构函数中,我们需要释放指针成员所占用的内存空间,避免内存泄漏

        深拷贝对于包含动态分配内存的对象非常重要,例如使用  new  或  malloc  分配的内存。通过实现深拷贝的拷贝构造函数,可以保证每个对象有独立的内存空间,避免潜在的内存管理问题,提高程序的稳定性和可靠性

总结

        本篇文章主要讨论拷贝函数的概念和使用方法。文章中涵盖了浅拷贝和深拷贝两种拷贝构造函数的介绍。

        拷贝函数:拷贝函数的概念和作用。浅拷贝拷贝构造函数,解释了浅拷贝的概念,即简单地将一个对象的数据成员的值复制到另一个对象中,详细介绍了浅拷贝的拷贝构造函数的实现,提供了一个示例,展示了如何使用浅拷贝拷贝构造函数。深拷贝拷贝构造函数,解释了深拷贝的概念,即在拷贝构造函数中创建一个新的对象,并复制源对象的所有数据成员(包括指针指向的数据),详细介绍了深拷贝的拷贝构造函数的实现,提供了一个示例,展示了如何使用深拷贝拷贝构造函数。

温馨提示

        感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

        再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

【C++入门到精通】C++入门 —— 深浅拷贝函数,C++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-643073.html

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

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

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

相关文章

  • 【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 我们模拟vector是用迭代器(start,end,endofstorage)来控制增删查改操作的 1普通构造 2迭代器构造 3初始化字符构造 4拷贝构造: 1当前大小(size()) 2总体容量(capacity()) 1begin()

    2024年02月15日
    浏览(59)
  • 【学姐面试宝典】前端基础篇Ⅴ——JS深浅拷贝、箭头函数、事件监听等

    前言 博主主页👉🏻蜡笔雏田学代码 专栏链接👉🏻【前端面试专栏】 今天继续学习前端面试题相关的知识! 感兴趣的小伙伴一起来看看吧~🤞 addEventListener()方法,用于向指定元素添加事件句柄,它可以更简单的控制事件。语 法为: 第一个参数是 事件的类型 (如 “click”

    2024年01月19日
    浏览(44)
  • 【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 在阅读本篇文章前,一定要先看前集: vector深度剖析(上) 本章重点: 本章会重点讲解vector迭代器失效问题 以及vector中的深浅拷贝问题 并且简

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

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

    2024年02月21日
    浏览(48)
  • 【C++入门到精通】C++入门 —— 引用、内联函数

    目录 一、引用 1.引用的概念 2.引用的特性 3.常引用 4.引用的使用场景         ⭕做参数         ⭕做返回值 5.传值、传引用效率比较 值和引用的作为返回值类型的性能比较 6.引用和指针的区别  引用和指针的不同点  二、内联函数 1.内联函数的概念 2.内联函数的特性

    2024年02月16日
    浏览(51)
  • 【C++入门到精通】C++入门 —— 类和对象(构造函数、析构函数)

    目录 一、类的6个默认成员函数  二、构造函数 ⭕构造函数概念 ⭕构造函数的特点 ⭕常见构造函数的几种类型 三、析构函数      ⭕析构函数概念     ⭕析构函数的特点 ⭕常见析构函数的几种类型 四、温馨提示          这一篇文章是上一篇的续集(这里有上篇链接)

    2024年02月15日
    浏览(50)
  • [开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

    写在前面 :Python和C++中的赋值与深浅拷贝,由于其各自语言特性的问题,在概念和实现上稍微有点差异,本文将这C++和Python中的拷贝与赋值放到一起,希望通过对比学习两语言实现上的异同点,加深对概念的理解。 C++中所谓的 浅拷贝 就是由(系统默认的) 拷贝构造函数对

    2024年02月02日
    浏览(54)
  • C++从入门到精通——函数重载

    函数重载是指在同一个作用域内,可以定义多个名称相同但参数列表不同的函数。这些函数具有不同的参数个数、类型或顺序,以便编译器能够根据传入的参数来确定调用哪个函数。函数重载使得代码更加简洁,避免了命名上的冗余,并提高了代码的可读性和可维护性。通过

    2024年04月08日
    浏览(37)
  • C++从入门到精通——内联函数

    内联函数是一种优化手段,通过在编译时将函数调用替换为函数体本身的复制品,以减少函数调用的开销。它适用于函数体较小、调用频繁的情况。使用内联函数可以提高程序执行效率,但也会增加最终生成的代码大小。在C++中,可以使用 inline 声明内联函数。然而,

    2024年04月10日
    浏览(40)
  • 【C++入门到精通】C++入门 —— 多态(抽象类和虚函数的魅力)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,也了解了C++中的模版,以及学习了几个STL的结构也相信大家都掌握

    2024年02月11日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包