首页 > 编程语言 >C++构造函数

C++构造函数

时间:2023-06-18 18:55:20浏览次数:43  
标签:初始化 RAII C++ GC 资源 构造函数

RAII

Resource Acquisition Is Initialization,资源获取即初始化

这是一种解决资源管理问题的方法,将资源的有效期与持有资源的对象的生命期严格绑定,由对象的构造函数完成资源的分配,由析构函数完成资源的释放
C++借助构造函数和析构函数,解决了传统的 malloc & freenew & delete 管理资源方法无法有效应对复杂资源管理场景的问题

对于资源管理需求,无GC机制的C++语言提供了基于析构函数的RAII方法和智能指针,有GC机制的Java语言提供了垃圾回收机制(Garbage Collection,GC).需要注意的是,虽然它们都能避免发生内存泄漏问题,但实现原理并不相同.

首先,从语言的设计角度来说,C++的设计应用场景要求其对代码的执行过程做到可控,RAII方法仍然需要手动释放资源,而GC机制并不需要开发者手动释放资源(这也是RAII方法和GC机制的一个显著区别),
即RAII并没有剥夺开发者手动管理资源的权限,它只是通过构造和析构函数提供了一种安全管理资源的方法,开发者对于执行过程是具有控制权的.而GC机制把资源的回收过程交由JVM负责,开发者无权控制.

关于可控性,还体现在析构函数和垃圾回收发生的时机上,在C++中通过{}来界定作用范围,当超出作用范围后即会调用对象的析构函数,即析构函数的调用时间是可预知的(适用于对时序有严格要求的场景),而垃圾回收机制的发生时间取决于JVM的资源管理策略,是开发者无权控制的.

无参构造函数

自定义

  1. 普通形式
  2. 使用初始化表达式

默认

POD陷阱(哪些类型不会自动初始化为0,大括号指定初始化值(0初始化方式))或等号指定初始化值(无法采用小括号指定初始化值)
支持单纯的大括号初始化,等号和大括号同时使用的初始化方式

当自定义构造函数后,默认无参构造函数就不存在了,可通过default生成默认的无参构造函数

多参数构造函数

  1. 普通形式
  2. 使用初始化表达式
    explicit禁止隐式转换(我自己说的,具体作用要查一下)

单参数构造函数

陷阱,explicit避免陷阱

拷贝构造函数

可通过delete禁用拷贝构造函数

移动构造函数

C++11 引入

拷贝赋值运算符

移动赋值运算符

C++11引入

解构(析构)函数

标签:初始化,RAII,C++,GC,资源,构造函数
From: https://www.cnblogs.com/hongyugao/p/17489579.html

相关文章

  • C++创建对象的4种方式对比
    三种方式分别为等号,圆括号,大括号,最后一种是等号和大括号一起使用等号和圆括号是以前就存在的,大括号是新的语法,其具有2个优点:防止变窄转换:大括号不支持变窄转换,等号和圆括号为了向下兼容支持变窄转换免疫C++最令人头疼的解析:C++规定任何可以被解析为一个声明的东西必......
  • Python和C++之间的主要区别点?
    Python和C++之间的区别可以简洁地概括如下:编程范式:Python是一种解释型、面向对象的动态语言,更注重代码的简洁性和可读性,适合快速开发和原型设计。C++是一种编译型、多范式语言,支持面向对象、过程式和泛型编程,更注重底层的控制和性能优化。语法复杂性:C++具有较为复杂的语法和......
  • C++家谱管理系统[2023-06-18]
    C++家谱管理系统[2023-06-18]小组项目二实验题目:家谱管理系统实验目的:1、掌握树以及二叉树的定义;2、掌握树以及二叉树的基本操作,如建立、查找、插入和删除等。实验要求:小组合作方式,共同讨论完成该任务。实验内容:家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系......
  • 【详解C++中的引用】
    @TOC一、什么是引用引用就是给一个变量取别名。注意:这个引用不会新开辟一块空间,而是和原来的变量公用一块空间。举个例子:李逵,在家称为"铁牛",江湖上人称"黑旋风"。二、引用规则引用规则:引用实体类型+&+引用别名=引用实体。比如下面:intmain(){ inta=10; //引用 int&ba=a......
  • Licensecc-C++ License Manager
    [email protected] Licensecc:aC++softwarelicensemanager。使用Licensecc可以给开发的软件加上保护,限制软件的使用。通过授权控制来限制软件的使用,也可以限制软件的使用时间,及限制软件在指定机器上运行。Licensecc是基于BSD协议开源的软件授权......
  • C++ STL(algorithm)
    1字符和整数排序#include<iostream>#include<algorithm>usingnamespacestd;voidstl1(){inta[]={-1,9,-34,100,45,2,98,32};intlen=sizeof(a)/sizeof(int);sort(a,a+len);//由小到大排列sort(a,a+len,greater<int>());//由大到小排列}vo......
  • C++ STL(algorithm)
    1字符和整数排序#include<iostream>#include<algorithm>usingnamespacestd;voidstl1(){inta[]={-1,9,-34,100,45,2,98,32};intlen=sizeof(a)/sizeof(int);sort(a,a+len);//由小到大排列sort(a,a+len,greater<int>());//由大到小排列}vo......
  • [pybind11]为c++项目写python API接口
    C++项目的pybind方法有哪些?有什么区别?以下是主要的python绑定cpp的方法:方法年份代表用户适用于CPython的C/C++扩展模块1991标准库PyBind11(推荐用于C++)2015Cython(推荐用于C)2007gevent、kivyHPy2019mypyc2017ctype2003oscryptocffi......
  • 关于如何使用C++进行编程(不使用数据库的情况下)
    问题描述对于一个长期使用Java连接数据库,实现javaweb编程的软工友友来说,突然在编程任务中不允许连接数据库,就有一点的蒙圈,没有办法,只能去查阅资料啦!问题解决不出意外的话,这次我们就需要使用文件操作来存储数据啦!(然后另外一种方法时json,显然,文件操作更加简单一点、也是更加熟悉......
  • C++异常处理
    需要异常处理的情况程序运行时常会碰到一些异常情况,例如:做除法的时候除数为0;用户输入年龄时输入了一个负数;用new运算符动态分配空间时,空间不够导致无法分配;访问数组元素时,下标越界;打开文件读取时,文件不存在。这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。......