C++构造函数的类型,浅拷贝与深拷贝详解

 更新时间:2022年03月30日 11:31:45   作者:小子挺不错  
这篇文章主要为大家详细介绍了C++构造函数的类型,浅拷贝与深拷贝,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、无参构造函数

1.如果没有定义构造函数,则系统自动调用此默认构造函数,且什么都不做。

2.如果用户自定义了带参数的构造函数,若还想调用无参的构造函数,必须显示定义

person() {
	cout << "this object is being created." << endl;
}

二、含参构造函数

一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,前提是参数的个数或者类型不同(基于c++的重载函数原理)

person(string ID, int age, int height, string sex) {
	cout<<"含参构造函数调用"<< endl;
	this.ID = ID;
	this.age = age;
	this.height = height;
	this.sex = sex;
}

含参的构造函数还可以使用快速初始化的方法:

person(string ID, int age, int height, string sex) : ID(ID), age(age), height(height), sex(sex) { }

注意:

  • 初始化参数列表和初始化顺序不可以变动
  • 变量名称(不是参数列表名称)一定要和成员变量名一样

三、拷贝构造函数

使用已经创建好的同一类对象,进行构造另一个对象。

person(const person &p) {
	cout << "拷贝构造函数调用" << endl;
	this->ID = p.ID;
	this->age = p.age;
	this->height = p.height;
	this->sex = p.sex;
}

注意:

但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,具体原因请查询有关 “浅拷贝“

四、深拷贝和浅拷贝

浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。

例如: person p2 = p1; 这就是浅拷贝,将p1中的成员变量值赋给p2,在这里其实就相当于拷贝构造函数的调用。

但是,浅拷贝,在成员变量是引用类型(指针)时,会出现问题。

  • 传参问题中,地址传递后可以实现swap函数的调用,这就是浅拷贝的原理
  • 当我们使用浅拷贝时,引用类型传递的依旧是地址,这也就是说,拷贝后的对象和拷贝的对象中引用对象指向同一块地址,这样就出现问题了。

在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间。

如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。

上面提到,如果没有自定义复制构造函数,则系统会创建默认的复制构造函数,但系统创建的默认复制构造函数只会执行“浅拷贝”,即将被拷贝对象的数据成员的值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,delete该指针时则会导致两次重复delete而出错。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C ++迭代器iterator在string中使用方法介绍

    C ++迭代器iterator在string中使用方法介绍

    迭代器是一种检查容器内元素并遍历元素的数据类型。迭代器是一个变量,提供对一个容器中的对象的(间接)访问方法,并且定义了容器中对象的范围。迭代器可以指向容器中的某个元素,通过迭代器就可以对非数组(存储空间不连续)的数据结构进行遍历
    2022-10-10
  • C语言利用EasyX实现绘制足球图案

    C语言利用EasyX实现绘制足球图案

    这篇文章主要为大家详细介绍了C语言如何利用EasyX绘图库实现绘制一个简单的足球图案,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • C++实现简单的信息管理系统

    C++实现简单的信息管理系统

    这篇文章主要为大家介绍了C++实现简单的信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • C++超详细讲解拷贝构造函数

    C++超详细讲解拷贝构造函数

    我们经常会用一个变量去初始化一个同类型的变量,那么对于自定义的类型也应该有类似的操作,那么创建对象时如何使用一个已经存在的对象去创建另一个与之相同的对象呢
    2022-06-06
  • 一文搞懂Codec2框架解析

    一文搞懂Codec2框架解析

    这篇文章主要介绍了Codec2框架解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C语言实现通讯录的方法(包括静态版本和动态版本)

    C语言实现通讯录的方法(包括静态版本和动态版本)

    本文给大家分享C语言实现通讯录的方法(包括静态版本和动态版本),针对每种方法给大家介绍的非常详细,需要的朋友参考下吧
    2021-09-09
  • C++二叉树的前序中序后序非递归实现方法详细讲解

    C++二叉树的前序中序后序非递归实现方法详细讲解

    前序遍历的顺序是根、左、右。任何一颗树都可以认为分为左路节点,左路节点的右子树。先访问左路节点,再来访问左路节点的右子树。把访问左路节点的右子树看成一个子问题,就可以完整递归访问了
    2023-03-03
  • 通俗易懂的C++前缀和与差分算法图文示例详解

    通俗易懂的C++前缀和与差分算法图文示例详解

    这篇文章主要为大家非常通俗易懂的讲解了C++前缀和与差分算法的图文分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • Cocos2d-x中背景音乐和音效使用实例

    Cocos2d-x中背景音乐和音效使用实例

    这篇文章主要介绍了Cocos2d-x中背景音乐和音效使用实例,注意本文中使用大量注释来说明背景音乐和音效的使用方法,需要的朋友可以参考下
    2014-09-09
  • Matlab实现数据的动态显示方法

    Matlab实现数据的动态显示方法

    这篇文章主要为大家详细介绍了Matlab使用Plot函数实现数据动态显示方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论