【C++札记】拷贝构造函数,浅拷贝和深拷贝
一:拷贝构造函数
拷贝构造函数是一种特殊的构造函数,遵循如下的规则:
1.函数名和类名一致,没有返回值。
2.必须有一个参数,参数是本类型的一个引用变量。
3.拷贝构造函数可以访问参数对象的任意成员(private也可以)。
4.若自己不提供拷贝构造函数,系统会提供默认构造函数,若自己定义,系统将不再提供。
5.系统提供的拷贝构造是浅拷贝。
书写示例如下:
class Student
{
public:
//构造函数
Student(int a, char* p);
//拷贝构造函数
Student(const Student& stu);
char name[32];
int age;
};
拷贝构造函数调用
//调用方法1
Object obj1;
Object obj2(obj1); //或者写成:Object obj2 = obj1;
//调用方法2
Object obj1;
Object* obj2 = new Object(obj1);
二:浅拷贝
浅拷贝不开辟新空间,只增加一个指针,指向原有的内存。

#include <iostream>
using namespace std;
class Student
{
public:
//构造函数
Student(const char* myName)
{
int len = strlen(myName);
name = new char[len + 1]{0};
strcpy_s(this->name, len+1, myName);
cout << "构造:" << hex << (int)name << endl;
}
//析构函数
~Student()
{
if (name)
{
cout << "析构:" << hex << (int)name << endl;
delete[] name;
name = NULL;
}
}
//拷贝构造函数(浅拷贝)
Student(const Student& stu)
{
name = stu.name;
cout << "调用拷贝构造函数" << endl;
}
private:
char* name;
};
int main()
{
{
Student stu1("hongshaorou");
Student stu2(stu1);
}
}
运行过程中发生了崩溃

是因为对相同的内存地址做了两次析构导致,打印出内存地址一目了然。

三:深拷贝
深拷贝会开辟新的内存空间,把原有的对象复制过来。见下图:

对上边浅拷贝代码进行修改
class Student
{
public:
//构造函数
Student(const char* myName)
{
int len = strlen(myName);
name = new char[len + 1]{0};
strcpy_s(this->name, len+1, myName);
cout << "构造:" << hex << (int)name << endl;
}
//析构函数
~Student()
{
if (name)
{
cout << "析构:" << hex << (int)name << endl;
delete[] name;
name = NULL;
}
}
//拷贝构造函数(深拷贝)
Student(const Student& stu)
{
int len = strlen(stu.name);
name = new char[len + 1];
strcpy_s(name, len + 1, stu.name);
cout << "调用拷贝构造函数" << hex << (int)name<< endl;
}
private:
char* name;
};
再次运行不会发生崩溃现象,打印内存地址可见,开辟了内存空间。


【C++札记】拷贝构造函数,浅拷贝和深拷贝的更多相关文章
- 一文搞懂Java引用拷贝、浅拷贝、深拷贝
微信搜一搜 「bigsai」 专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 在开发.刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况 ...
- ObjectiveC中的赋值,对象拷贝,浅拷贝与深拷贝
在开发过程中我们经常会遇到对象拷贝的问题,下面我们分别讨论赋值操作.对象拷贝.以及浅拷贝(Shallow copy)与深拷贝(Deep copy)的区别与各自的实现方式. 一.不同对象的赋值操作 Ob ...
- C++雾中风景6:拷贝构造函数与赋值函数
在进行C++类编写的过程之中,通常会涉及到类的拷贝构造函数与类的赋值函数.初涉类编写的代码,对于两类函数的用法一直是挺让人困惑的内容.这篇文章我们会详细来梳理拷贝构造函数与赋值函数的区别. 1.调用了 ...
- C++ 浅拷贝与深拷贝探究
C++浅拷贝与深拷贝探究 浅拷贝与深拷贝的概念是在类的复制/拷贝构造函数中出现的. 拷贝构造函数使用场景 对象作为参数,以值传递方式传入函数(要调用拷贝构造函数将实参拷贝给函数栈中的形参) 对象作为返 ...
- C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++中拷贝构造函数
C++中拷贝构造函数 1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了.(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数.百度百科上 ...
- c#中浅拷贝和深拷贝的理解
c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...
- IOS的浅拷贝和深拷贝
什么是深拷贝和浅拷贝 浅拷贝:就是指针的复制,拷贝的指针跟原指针指向内存中的同一个位置的对象.至于对象的引用计数值是否+1,就是看拷贝的指针赋给给的变量是Strong类型的,还是week类型的. 如果 ...
- 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深 ...
- 我的Python学习笔记(二):浅拷贝和深拷贝
在Python中,对象赋值,拷贝(浅拷贝和深拷贝)之间是有差异的,我们通过下列代码来介绍其区别 一.对象赋值 对象赋值不会复制对象,它只会复制一个对象引用,不会开辟新的内存空间 如下例所示,将test ...
随机推荐
- php正则表示中的元字符
元字符 抛出问题: \d 代表匹配一个字符.而我现在想要匹配十个八个,任意多个数字肿么办? 这个时候我们就要用到元字符.在使用原子的时候,发现只能够匹配一个字符,可是要匹配多个字符就出现了问题.大理石 ...
- webuploader之大文件分段上传、断点续传
文件夹数据库处理逻辑 public class DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject() ...
- learning java 实例序列化
对Person类实例进行序例化及反序例化: Person.java public class Person implements java.io.Serializable { private Stri ...
- 洛谷 CF894A QAQ
目录 题目 思路 \(Code\) 题目 CF894A 思路 \(\text{DP}\) 一个数组\(\text{QAQ[4][101]}\) \(\text{QAQ[1][i]表示在i这个位置q的个 ...
- GUI引发的一场脑部大战|wine、wsl、mono、gtk、qt
没写完不想写了,先发布吧,这就是一个引子. 在春天种下一颗种子---- GUI引发的一场脑部大战|wine.wsl.mono.gtk.qt 思路开拓了,方法一下子就来了 wine可以运行大部分Wind ...
- 最近公司遇到了APR攻击,顺便了解一下知识
原因及背景 最近公司遇到了APR攻击导致整个公司研发部.测试部.客服部.工程部等几个部门统一无法上网,TV(team viewer)无法使用,部署在公网的B/S架构系统系统无法访问,开发代码上传和下载 ...
- mysql 获取单个科目的平均分
mysql> select * from test; +----+----------+-------+-----------+ | id | name | score | subject | ...
- django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applie
Traceback (most recent call last): File "manage.py", line 15, in <module> execute_fr ...
- 高斯混合模型(GMM)及MATLAB代码
之前在学习中遇到高斯混合模型,卡了很长一段时间,在这里记下学习中的一些问题以及解决的方法.希望看到这篇文章的同学们对高斯混合模型能有一些基本的概念.全文不废话,直接上重点. 本文将从以下三个问题详解高 ...
- TensorFlow之卷积函数(conv2d)
卷积函数是卷积神经网络(CNN)非常核心和重要的函数,在搭建CNN时经常会用到,因此较为详细和深入的理解卷积函数具有十分重要的意义. tf.nn.conv2d(input, filter, strid ...