C++中构造函数详解

 更新时间:2022年02月10日 08:45:00   作者:m0_65462159  
大家好,本篇文章主要讲的是C++中构造函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

构造函数按参数为为:有参构造函数和无参构造函数

按类型分为:普通构造函数和拷贝构造函数

构造函数的三种调用方法:括号法,显示法,隐式转换法;

//括号法
Person p1;     //默认构造 无参构造
Person p2(13); //有参构造
Person p3(p2); //拷贝构造
 
//注意:使用无参构造时不要写括号。不然系统会认为该语句是函数声明。 例:Person p1();
 
//显示法
Person p1;
Person p2 = Person(13);//有参构造
Person p3 = Person(p2);//拷贝构造
 
//注意:右值的写法称为匿名对象,当前行执行完后,系统就会释放该对象。
 
//隐式转换法
Person p4 = 13;//相当于 Person p4 = Person(13);
Person p5 = p4;//拷贝构造

C++中拷贝构造函数的调用时机:

一,一般会使用一个已创建好的对象来初始化一个新对象

Person p1;
 
Person p2(p1);
Person p3 = Person(p2);
Person p4 = p3;

二,值传递方式给形参传值

void function(Person p)
{
    
}
 
int main()
{
    Person p1;
    function(p1);//这里以值传递,其实是Person temp = p1;调用拷贝构造函数
 
}

三,值返回方式返回局部对象

Person function()
{
    Person p1;//创建对象
 
    return p1;//返回局部对象
}
 
void test()
{
    Person p = function();//值传递实际上是用一个temp去拷贝原来的值,然后原来的局部对象被释放。temp作为返回值被接收。
 
}

构造函数调用规则。

如果自定义了有参构造函数,系统则不提供默认构造函数,但仍然提供拷贝构造函数。

如果自定义了拷贝构造函数,系统则不提供其他构造函数,需要的话要自己写。

深拷贝和浅拷贝

我们系统提供的默认拷贝构造函数是一种浅拷贝,所谓浅拷贝,其实就是简单的值拷贝,我们都知道,对象被释放的时候会调用析构函数,而析构函数的作用就是把对象的资源释放,例如你的对象有属性开辟到了堆区,析构时就需要delete释放掉。

class Person{
public:
    Person(string name,int age)
    {
        this->name = name;
        this->age = new int(age);//这个属性开辟到了堆区
    }
    
    Person(const Person &p)
    {
        name = p.name;
        age  = new int(*p.age);//深拷贝,new一块新的内存,避免重复释放同一内存
    }
 
    void show()
    {
        cout << name << endl;
        cout << *age  << endl;
    }
    
    ~Person()
    {
        if(age != NULL)
        {
            delete age;
            age = NULL;
        }
        
    }//
 
 
private:
    string name;
    int *age;
 
};
 
 
int main()
{
    Person p1("hzh",21);//初始化对象
    Person p2(p1);      //如果不写上面的拷贝构造函数,则默认拷贝构造(浅拷贝)
                        //这样会发送的问题,因为属性中有指针,浅拷贝时把指针指向的地址拷贝给了p2
                        //则两个指针指向的是同一个地址,而析构时会因为重复释放一块内存而造成错误。 
   return 0;
}

要解决上述问题,就要自己写一个拷贝构造函数来实现深拷贝,具体操作为把开辟到堆区的属性在拷贝时重新new一块内存去存放。

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

相关文章

  • C语言新手练习之多维数组、结构体及函数

    C语言新手练习之多维数组、结构体及函数

    这篇文章主要给大家介绍了关于C语言新手练习之多维数组、结构体及函数的相关资料,这些内容在我们日常开发中经常会遇到的,需要的朋友可以参考下
    2021-06-06
  • C++11学习之包装器解析

    C++11学习之包装器解析

    function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。本文就来和大家聊聊我们为什么需要function呢
    2023-02-02
  • C语言实现合式公式的判断示例

    C语言实现合式公式的判断示例

    这篇文章主要介绍了C语言实现合式公式的判断示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C++链式二叉树深入分析

    C++链式二叉树深入分析

    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址
    2022-06-06
  • C++面试八股文之static_cast你了解吗

    C++面试八股文之static_cast你了解吗

    C++11引入四种新的类型转换,分别是static_cast、dynamic_cast、const_cast、和reinterpret_cast,下面就来和大家讲讲static_cast中面试常考的知识点吧
    2023-06-06
  • C/C++运用WMI接口实现查询系统信息

    C/C++运用WMI接口实现查询系统信息

    Windows Management Instrumentation(WMI)是一种用于管理和监视Windows操作系统的框架,本文主要介绍了如何运用WMI接口实现查询系统信息,感兴趣的可以了解下
    2023-11-11
  • C语言中的内联函数(inline)与宏定义(#define)详细解析

    C语言中的内联函数(inline)与宏定义(#define)详细解析

    内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline
    2013-09-09
  • C语言关于自定义数据类型之枚举和联合体详解

    C语言关于自定义数据类型之枚举和联合体详解

    枚举顾名思义就是把所有的可能性列举出来,像一个星期分为七天我们就可以使用枚举,联合体是由关键字union和标签定义的,和枚举是一样的定义方式,不一样的是,一个联合体只有一块内存空间,什么意思呢,就相当于只开辟最大的变量的内存,其他的变量都在那个变量占据空间
    2021-11-11
  • Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法及QTableView与QTableWidget区别

    Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法及QTableView与QTableWidget区

    这篇文章主要介绍了Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法,需要的朋友可以参考下
    2020-03-03
  • C语言SetConsoleCursorPosition函数使用方法

    C语言SetConsoleCursorPosition函数使用方法

    这篇文章介绍了C语言SetConsoleCursorPosition函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论