拷贝构造与深浅拷贝

简介: 一、拷贝构造函数二、拷贝初始化三、深浅拷贝

文章目录
一、拷贝构造函数
二、拷贝初始化
三、深浅拷贝
一、拷贝构造函数
如果一个构造函数的第一个参数是自身类型的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数。

class person
{
public:
person(); //默认构造函数
person(const person&);//拷贝构造函数
};
1
2
3
4
5
6
拷贝构造函数的第一个参数必须是一个引用类型。
如果没有定义一个拷贝构造函数,编译器会自动为我们定义一个,与合成拷贝构造函数。
合成拷贝构造函数用来阻止我们拷贝该类类型的对象。合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中。每个成员的类型决定了它如何拷贝,对于类类型的成员,会使用其拷贝构造函数来拷贝,内置类型的成员则直接拷贝。

二、拷贝初始化
//直接初始化
string dot(100,',');
string ss(dot);
//拷贝初始化
string s1=dot;
string s2="1324135";
string s3=string(100,'2');

1
2
3
4
5
6
7
8
直接初始化,实际要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。
拷贝初始化,要求编译器将右侧运算对象拷贝到正在创建的对象中,如果有需要还要进行类型转换。

三、深浅拷贝
先来看代码

include

using namespace std;
class person
{
public:

person()
{
    cout << "person()的默认构造" << endl;
}
person(int age,int hight)
{
    myage = age;
    myheight =new int( hight);
    cout << "person()的有参函数构造" << endl;
}
//shenkaobei
person(const person& p)
{
    myage = p.myage;
    //myheight = p.myheight;编译器默认(浅拷贝)提供的
    //因为是指针地址,会导致两个名释放同一块内存空间
    //深拷贝
    myheight = new int(*p.myheight);
}
~person()
{
    //析构函数将,堆区 ,开辟的数据进行释放
    if (myheight != NULL)
    {
        delete myheight;
        myheight = NULL;
    }
    cout << "person()的析构函数构造" << endl;
}
int myage;
int* myheight;

};
void test01()
{

person p1(10,120);


person p2(p1);
cout << p2.myage<<endl <<*p2.myheight<< endl;
return;

}
int main()
{

test01();
system("pause");
return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
浅拷贝:myage = p.myage;
深拷贝:myheight = new int(*p.myheight);
拷贝函数:person p2(p1);、
进行析构时,由于创建了两个对象。p1,p2,所以析构时会调用两次析构函数,所以如果要是进行浅拷贝的话,myheight=p.myheight;

相当于把地址赋值给p2,两个p1 p2指向同一块内存,所以再释放时
会释放两次。
而深拷贝则会从新开辟一块内存,从而防止同一块内存释放两次。

目录
相关文章
|
存储 算法 NoSQL
TinyKv介绍
TinyKv介绍
596 1
|
SQL 关系型数据库 MySQL
python使用SQLAlchemy进行mysql的ORM操作
python使用SQLAlchemy进行mysql的ORM操作
267 0
|
10月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
291 9
|
8月前
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
|
8月前
|
缓存 并行计算 数据处理
全面提升Python性能的十三种优化技巧
通过应用上述十三种优化技巧,开发者可以显著提高Python代码的执行效率和性能。每个技巧都针对特定的性能瓶颈进行优化,从内存管理到并行计算,再到使用高效的数值计算库。这些优化不仅能提升代码的运行速度,还能提高代码的可读性和可维护性。希望这些技巧能帮助开发者在实际项目中实现更高效的Python编程。
668 22
|
负载均衡 监控 算法
|
存储 Go 索引
GOLANG MAP 底层实现
GOLANG MAP 底层实现
412 2
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
机器学习/深度学习 运维 算法
[WWW2024]轻量数据依赖的异常检测重训练方法LARA
阿里云计算平台大数据基础工程技术团队主导,与浙江大学合作的论文《LARA: ALight and Anti-overfitting Retraining Approach for Unsupervised Time Series Anomaly Detection 》被WWW2024收录
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
940 0