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

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

服务器之家 - 编程语言 - C/C++ - c++特殊构造函数详解

c++特殊构造函数详解

2022-08-09 10:46隐匿269 C/C++

大家好,本篇文章主要讲的是c++特殊构造函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

前言

众所周知,构造函数的作用是类在创建对象时的初始化,而拷贝构造函数则是构造函数里的一种特殊构造。

拷贝构造函数

拷贝构造:是C++特有的,他是一种特殊的构造函数

用于基于一个同一个类的的第一个对象去创造和初始化的一个对象

第一的参数是本类的对象的引用(const)

一、什么是拷贝构造函数

一种特殊的构造函数,同一个类的一个对象去创造或初始化一个对象

在没写的时候,是默认存在的,自己写了之后,系统默认的就会消失(这一点,就是构造函数)

拷贝构造函数可以实现:对象的复制

?
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
class Monster
{
public:
 
    Monster(Monster& m)     //拷贝构造函数(默认形态)
    {
        //默认的拷贝构造函数(默认形态),将对象一一对应给值
        cout << "默认的拷贝构造函数(默认形态) " << endl;
        this->hp = m.hp;
    }
    Monster(int hp);        //构造函数
    ~Monster();             //析构函数
    void show();
private:
    int hp;
};
int main()
{
    Monster monster1(100);
    monster1.show();
    Monster monster3 = monster1;//使用monster1给monster3初始化
    monster3.show();
    Monster monster4(monster1);//使用monster1去构造monster4
    monster4.show();
    return 0;
}
Monster::Monster(int hp)
{
    cout << "调用了带参构造函数" << endl;
    this->hp = hp;
}
Monster::~Monster()
{
    cout << "调用了析构函数" << endl;
}
void Monster::show()
{
    cout << "调用了显示函数" << endl;
    cout<<this->hp << "" << endl;
 
}

二、调用时机

一、函数的参数是:“类的对象”

二、函数的返回值是类的对象

三、使用一的对象给另一个对象初始化

四、使用一个对象构造另一个对象

注意

赋值不属于拷贝构造,所以不调用拷贝构造函数

浅拷贝和深拷贝

浅拷贝就是默认的拷贝构造函数,这个拷贝构造的操作,我们可以理解为,是用‘=’号一个一个的赋值的,我们将之称为,浅拷贝,因为在用指针的时候就可以能会出现问,因为我们知道两个同等类型的指针之间用‘=’号赋值,是两个指针的地址指向同一个内存,那么就可能会存在一个问题,就是两个对象的指针都指向同一个内存,那么如果其中一个对象把该内存释放了,就会导致另外一个对象的指针变成野指针。 

为此,我们就需要进行到深拷贝

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public:
    int *p;
    Rect();
    ~Rect();
    int width;//宽
    int height;//高
    //重载拷贝构造,实现浅拷贝拷贝
    Rect(Rect&rect)
    {
        
        this->height = rect.height;
        this->width = rect.width;
        this->p=rect.p;
    }
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public:
    int *p;
    Rect();
    ~Rect();
    int width;//宽
    int height;//高
    //重载拷贝构造,实现深拷贝
    Rect(Rect&rect)
    {
        
        this->height = rect.height;
        this->width = rect.width;
        this->p = new int;//重新申请内存
        *p = *rect.p;//拷贝之前的值
    }

可见,浅拷贝与深拷贝的差距就是前者是直接拷贝指针,让两个指针同时指向一个地址,这样一方进行析构的时候,另一方就会成为野指针,而深拷贝就是避免了这一点,申请一块新内存,并复制这块内存的数据。

总结

到此这篇关于c++特殊构造函数详解的文章就介绍到这了,更多相关c++特殊构造函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_60669466/article/details/122312424

延伸 · 阅读

精彩推荐
  • C/C++C++实现基于控制台界面的吃豆子游戏

    C++实现基于控制台界面的吃豆子游戏

    这篇文章主要介绍了C++实现基于控制台界面的吃豆子游戏,实例分析了吃豆子游戏的原理与C++实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    司青10502021-02-25
  • C/C++C语言实现清空指定文件夹中所有文件的方法

    C语言实现清空指定文件夹中所有文件的方法

    这篇文章主要介绍了C语言实现清空指定文件夹中所有文件的方法,实例分析了C语言实现文件删除的相关技巧,需要的朋友可以参考下...

    小卒过河9822021-02-27
  • C/C++C++静态成员变量和静态成员函数的使用方法总结

    C++静态成员变量和静态成员函数的使用方法总结

    下面小编就为大家带来一篇C++静态成员变量和静态成员函数的使用方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过...

    C++教程网10482021-04-27
  • C/C++c++中的const_cast用法大全

    c++中的const_cast用法大全

    const_cast转换符是用来移除变量的const或volatile限定符。对于后者,我不是太清楚,因为它涉及到了多线程的设计,今天重点给大家介绍c++中的const_cast用法大...

    guangod5102021-12-07
  • C/C++C语言实现万年历小程序

    C语言实现万年历小程序

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

    gaobosky5522021-08-04
  • C/C++C语言实现简单的三子棋

    C语言实现简单的三子棋

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

    一颗苹果.3632021-10-06
  • C/C++C语言通讯录管理系统完整版

    C语言通讯录管理系统完整版

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

    hackbuteer19882021-06-20
  • C/C++用C语言的泛型实现交换两个变量值

    用C语言的泛型实现交换两个变量值

    在日常编程里面经常会遇到交换两个变量的内容的任务,对于泛型类型而言有两种泛型策略来实现,下面跟着小编一起来学习学习。...

    C语言中文网6092021-04-15