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

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

服务器之家 - 编程语言 - C/C++ - C++分析构造函数与析造函数的特点梳理

C++分析构造函数与析造函数的特点梳理

2022-11-25 13:44Gy648 C/C++

本文对类的构造函数和析构函数进行总结,主要包括了构造函数的初始化、重载、使用参数和默认参数,拷贝构造函数和析构函数,希望能帮助读者在程序开发中更好的理解类,属于C/C++基础

构造函数的调用

默认情况下编译器至少给一个类添加3个函数

1.默认构造函数(无参,函数体实现)--完成对象的初始化

2.默认析构函数(无参,函数体为空)--完成对象的清理

3.默认拷贝构造函数,属性进行值拷贝

规则:

如果用户定义了有参构造,c++不会提供无参构造,但是提供默认拷贝构造

如果用户定义了拷贝构造函数,c++不会在提供其他函数

类名(){}

构造函数的语法

1,没有返回值,也不写void;

2,函数名称与类名相同;

3,构造函数可以有参数,因此可以发生重载;

4,程序在调用对象时会自动调用构造函数,无需手动调用且只调用一次

析造函数~类名()

1.析造函数,没有返回值也不写void

2.函数名称与类名相同在前面加上~

3.构造函数不可以有参数,因此不可以发生重载

4.程序在对象销毁会自动调用析构,与构造函数的调用规则相同

构造函数的分类及调用

1.按照参数分类为 无参构造和 有参构造

?
1
2
3
4
5
6
7
8
9
10
11
12
class person
{
public:
    person()
    {
    cout<<"无参构造的调用"<<endl;
    }
    person(int a)
    {
    cout<<"有参构造的调用"<<endl;
    }
};

2.按照类型分为 普通构造和 拷贝构造

?
1
2
3
person(const person& p)
{
}

拷贝构造的语法

调用构造函数的方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void test()
{
    //1.括号法
    person p1;//默认无参构造调用
    person p2(10);//默认有参构造的调用
     preson p3(p2);//拷贝构造的调用;
    //若是这样写 下面这行代码会被认为是编译器的声明
     person p1();  // void func();
   // 无法完成函数的调用
    2.显示法
    person p1;
    person p2=person(10);
    person p3=person(p2);
    // 匿名对象
   person(10);//特点:当前行执行结束后,系统会立即回收匿名对象
    // 3.隐式转换法
    person p4=10;// 相当于 写了 person p4 =person(10);
    person p5=p4;
}

拷贝构造的调用时机

1.使用一个已经创建完毕的对象来初始化一个新对象

2.值传递的形式给函数参数传值

?
1
2
3
4
5
6
7
8
9
10
11
class p
{
};
void dowork(person p )//形参p
{
}
void test02()
{
    person p;
    dowork(p);// 相当于发生了隐式类型转换 传入值拷贝 person p=p;
}

3.值方式返回局部对象

深拷贝与浅拷贝

如果利用编译器提供的拷贝构造函数

C++分析构造函数与析造函数的特点梳理

会做浅(值)拷贝的操作(会使得new的对象指针指向同一个地址),会带来对堆区内存持续释放的问题

如果堆区开辟了内存,可以在析构函数中释放;

对于拷贝构造函数,可以自己实现一个拷贝构造函数(深拷贝)(new一个新的对象实现拷贝构造)

总结: 如果属性有在堆区开辟,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

初始化列表

c++提供了初始化列表语法用来初始化属性

C++分析构造函数与析造函数的特点梳理

C++分析构造函数与析造函数的特点梳理

?
1
2
3
4
5
6
7
8
9
class person
{
    person(int a,int b,int c):m_a(a),m_b(b),m_c(c);
    {
    }
    int m_a;
    int m_b;
    int m_c;
};

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

原文链接:https://blog.csdn.net/m0_63515013/article/details/123507346

延伸 · 阅读

精彩推荐
  • C/C++C++中explict关键字用法

    C++中explict关键字用法

    这篇文章主要介绍了C++中explict关键字用法的相关资料,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧...

    randall235942021-04-16
  • C/C++C++中const修饰符的详解及其作用介绍

    C++中const修饰符的详解及其作用介绍

    这篇文章主要介绍了C++中const修饰符的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    我是小白呀4852021-12-30
  • C/C++C语言实现的阶乘,排列和组合实例

    C语言实现的阶乘,排列和组合实例

    这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    宋勇野5512021-03-02
  • C/C++Unity编辑器下重启的方法

    Unity编辑器下重启的方法

    这篇文章主要介绍了Unity编辑器下重启的方法的相关资料,希望通过本文能帮助到大家,让大家学习理解这部分内容,需要的朋友可以参考下...

    wuzhang11792021-06-06
  • C/C++c语言中如何修改文件中间的几个字节

    c语言中如何修改文件中间的几个字节

    工作中碰到一个问题,如何只修改文件中间的几个字节,而其他的内容不变。这个问题看似简单,但是很多人估计都不知道怎么做。我开始seek到文件的特定...

    薰衣草的旋律7522021-09-28
  • C/C++C++ 实例之九宫格广度优先遍历

    C++ 实例之九宫格广度优先遍历

    这篇文章主要介绍了C++ 实例之九宫格广度优先遍历的相关资料,需要的朋友可以参考下...

    wtyvhreal7492021-05-09
  • C/C++C++编程中的函数指针初步解析

    C++编程中的函数指针初步解析

    这篇文章主要介绍了C++编程中的函数指针初步解析,函数指针在C语言和C++学习中都是非常重要的知识,需要的朋友可以参考下...

    candyliuxj6652021-03-31
  • C/C++c++11新增的便利算法实例分析

    c++11新增的便利算法实例分析

    这篇文章主要介绍了c++11新增的便利算法,主要有用于判断、查找、数组、序列等的操作算法,非常具有实用价值,需要的朋友可以参考下...

    C++教程网7982021-01-31