服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++的拷贝构造函数你了解吗

C++的拷贝构造函数你了解吗

2022-10-25 13:55Kallou C/C++

这篇文章主要为大家详细介绍了C++的拷贝构造函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

拷贝构造函数用以将一个类的对象拷贝给同一个类的另一个对象,比如之前学习过的string类:

?
1
2
string s1;
string s2 = s1;

一般情况下的拷贝构造函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
private:
    int n;
    double d;
    char s;
public:
    A(const A& a);
};
A::A(const A& a)
{
    this->n = a.n;
    this->d = a.d;
    this->s = a.s;
}

即按照数据类型开辟一段内存空间用以存放拷贝进来的对象的数据。需要注意的是必须传递进来的是类的引用,如果是按值传递,将会生成一个临时的类的对象a,并将传递进来对象拷贝给临时对象,其实就是又调用了拷贝构造函数。

默认拷贝构造函数:

如果用户没有自定义拷贝构造函数,又使用了对象的拷贝,则编译器会自动生成一个默认构造函数,格式同上。

浅拷贝和深拷贝:

大多数情况下,使用默认构造函数就可以完成对象的拷贝(浅拷贝),但是当对象中有诸如指针、动态数组等数据类型时使用默认构造函数则可能出错,此时需要用户自定义拷贝构造函数(深拷贝),以下是一个例子,首先是没有自定义拷贝构造函数的情况:

?
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
class A
{
private:
    char* str;
    int len;
public:
    A(const char* s);
    ~A();
    //A(const A& a);
};
A::A(const char* s)
{
    len = strlen(s);
    str = new char[len+1];
    strcpy(str, s);
    cout << str << " object construct." << endl;
}
A::~A()
{
    cout << str << " deleted." << endl;
    delete[]str;
}
//A::A(const A& a)
//{
//  this->len = a.len;
//  this->str = new char[a.len+1];
//  strcpy(str, a.str);
//}

调用函数:

?
1
2
3
4
5
6
int main(void)
{
    A a1("Hello");
    A a2 = a1;
    return 0;
}

运行结果:

Hello object construct.
Hello deleted.
葺葺葺葺葺葺葺葺攐? deleted.

这是因为在对象复制的时候,由于编译器生成了默认拷贝构造函数,只是单纯的将a1中指针str的值赋值给a2中的指针str,导致a2的生命周期结束时调用析构函数将str指向的内存空间内容释放掉了,于是a1生命周期结束时调用析构函数释放掉的内存中的内容就是无意义的字符了。

去掉注释后的正确写法:

?
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
class A
{
private:
    char* str;
    int len;
public:
    A(const char* s);
    ~A();
    A(const A& a);
};
A::A(const char* s)
{
    len = strlen(s);
    str = new char[len+1];
    strcpy(str, s);
    cout << str << " object construct." << endl;
}
A::~A()
{
    cout << str << " deleted." << endl;
    delete[]str;
}
A::A(const A& a)
{
    this->len = a.len;
    this->str = new char[a.len+1];
    strcpy(str, a.str);
}

调用函数同上。

运行结果:

Hello object construct.
Hello deleted.
Hello deleted.

这里自定义了拷贝构造函数,申请了一块新的内存空间来存放拷贝进来的字符串,因此释放时就不会出错了。

总结

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

原文链接:https://blog.csdn.net/Kallou/article/details/123602916

延伸 · 阅读

精彩推荐
  • C/C++C++中单链表的建立与基本操作

    C++中单链表的建立与基本操作

    以下是对C++中单链表的建立与基本操作进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助...

    C++教程网5042021-01-06
  • C/C++C语言实现俄罗斯方块源代码

    C语言实现俄罗斯方块源代码

    这篇文章主要为大家详细介绍了C语言实现俄罗斯方块的源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    name_文强8062021-06-26
  • C/C++C语言实现航班管理系统

    C语言实现航班管理系统

    这篇文章主要为大家详细介绍了C语言实现航班管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    dandelionLYY8222021-08-11
  • C/C++Matlab绘制中国地图超全教程详解

    Matlab绘制中国地图超全教程详解

    这篇文章主要介绍了如何利用Matlab绘制中国地图,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,感兴趣的小伙伴可以学习一下...

    slandarer6572022-10-08
  • C/C++C++中事件机制的简洁实现及需要放弃的特性

    C++中事件机制的简洁实现及需要放弃的特性

    事件模型是被广泛使用的好东西,但是C++标准库里没有现成的,现在VC11可以用在XP下了,那么就痛快的拿起C++11提供的先进设施组合出一个轻便的实现吧感兴...

    C++教程网1832020-11-17
  • C/C++C语言构建连连看游戏(矩阵方式)

    C语言构建连连看游戏(矩阵方式)

    这篇文章主要为大家详细介绍了C语言构建连连看游戏,采用矩阵方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    晴松-9242021-12-31
  • C/C++C++私有继承(三)

    C++私有继承(三)

    这篇文章主要介绍了C++私有继承(三),前面的文章我们已经介绍过了C++私有继承(一)和(二),下面小编就继续基于之前的内容继续向大家介绍C++私有...

    梁唐10342022-09-08
  • C/C++c++ map,mutimap删除问题分析

    c++ map,mutimap删除问题分析

    本文详细介绍c++ map,mutimap删除操作时的一些问题,提供了解决方法,需要的朋友可以参考下...

    C++教程网2782020-11-13