【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 ...
随机推荐
- Greenplum 6 新功能 在线扩容工具GPExpand (转载)
Gpexpand是Greenplum数据库的扩容工具,可以为集群增加新节点从而可以存储更多的数据,提供更高的计算能力.Greenplum 5及之前,集群扩容需要停机增加新节点,然后对表数据做重分布.因 ...
- WinDbg常用命令系列---!cppexr
!cppexr 简介 !cppexr显示C++异常记录的内容. 使用形式 !cppexr Address 参数 Address指定要显示的C++异常记录的地址. 支持环境 Windows 2000 E ...
- SQL基础-汇总统计及GROUP BY
一.汇总统计 1.聚集函数 COUNT() 计算总数 SUM() 求和 MAX() 最大值 MIN() 最小值 AVG() 平均值 2.聚集函数使用 总共有多少名学生? SELECT COUNT(*) ...
- Hdu 5093 Battle Ship
每个海面要么放要么不放,因此可以用二分图匹配, 考虑把同一行内的能互相看到的点放到一个行块里,同一列内能看到的点放到一个列块里,然后每一个行块都可以和该行块里所有海面的列块连边,选了这个行块,就必须选 ...
- mysql find_in_set 函数 使用方法
mysql> select * from user; +------+----------+-----------+ | id | name | address | +------+------ ...
- According to TLD or attribute directive in tag file, attribute items does not accept any expressions
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>报错 <%@ tagl ...
- [总结] MSF攻击数据库服务
0x01 攻击Mysql服务 1.1 目标探测 auxiliary/scanner/mysql/mysql_version 常用于内网中的批量mysql主机发现: 1.2 爆破登录 auxiliary ...
- avalon数据已更新,视图未更新的bug修复
$computed: { pinlei() { var key = this.currentProduct.key || 'youpin'; console.log(key, "我是key& ...
- Swarm容器集群管理(超详细)
一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...
- 刷题记录:[CISCN2019 总决赛 Day2 Web1]Easyweb
目录 刷题记录:[CISCN2019 总决赛 Day2 Web1]Easyweb 一.涉及知识点 1.敏感文件泄露 2.绕过及sql注入 3.文件上传:短标签绕过php过滤 刷题记录:[CISCN20 ...