C++学习日记---第14天(蓝桥杯备赛)

笔记复习

1.对象的初始化和清理


对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题

构造函数(初始化)和析构函数(清理)
c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作,对象的初始化和清理工作是编译器强制要我们做的事情,
因此如果我们不提供构造和析构,编译器会提供。编译器提供的构造函数和析构函数是空实现,即函数中没有代码可执行
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作

C++中构造函数随对象的创建而被调用,析构函数随对象的销毁而被调用
构造函数语法:类名(){}
1.函数名称与类名相同
2.构造函数可以有参数,因此可以发生重载
3.程序在调用对象时会自动调用构造函数,无须手动调用,而且只会调用一次
析构函数语法:~类名(){}
1.函数名称与类名相同,在名称前加上符号
2.析构函数不可以有参数,因此不可以发生重载
3.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次

下面用代码说明“程序在调用对象时会自动调用构造函数,无须手动调用,而且只会调用一次”

#include<iostream>
using namespace std;class person {
public:person() {cout << "person 构造函数的调用" << endl;}~person() {cout << "析构函数的调用" << endl;}
};int main() {person p;system("pause");return 0;
}

该程序运行的结果为

这里大家可能会疑惑,析构函数不是也会调用吗?为什么这里没有出现?

事实上在我们按下任意键之前,对象还没有被销毁,此时析构函数还未调用,当我们按下任意键之后析构函数会被调用

 2.构造函数的分类

构造函数有两种分类方式:

按参数分为:有参构造和无参构造(又称默认构造)

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

ps:拷贝构造函数,顾名思义,是为了创建一个与已存在对象一某一样的新对象

语法:类名(const 类名&p)其中的p无特殊含义,仅表示形参的名字

下面是代码示例:

#include<iostream>
using namespace std;class person {
public:person() {//无参构造(又称为默认构造)cout << "person的构造函数调用" << endl;}person(int a) {//有参构造age = a;cout << "person的有参构造函数调用" << endl;}// 拷贝构造函数person(const person& p) {cout << "person的拷贝构造函数调用" << endl;//将传入的人身上的所有属性,拷贝到我身上age = p.age;}~person() {cout << "person的析构函数调用" << endl;}
private:int age;
};

3.构造函数的调用方法

构造函数一共有三种调用方法,分别是括号法,显示法,隐式转换法

1)括号法

person p1;//默认构造函数的调用
person p2(10);//调用有参构造函数
person p3(p1);//调用拷贝构造函数

当我们想要调用默认构造函数时,不需要括号;当我们需要调用拷贝构造函数时,传入类的对象即可;当我们需要调用有参构造函数时,根据形参的类型传入对应类型的参数即可。

ps:如果我们在调用默认构造函数时加上了括号,但括号中没有其他的值,那么这个代码就会被编译器视为默认构造函数的声明

2)显示法

	person p1=person();无参构造person p2 = person(10); 有参构造person p3 = person(p2); 拷贝构造

3)隐式转换法

    person p4={};相当于写了 person p4=person();默认构造person p5 = 10;//相当于写了 person p5=person(10);有参构造person p6 = p5;//拷贝构造

4.拷贝函数的调用时机

前面我们讲拷贝函数是为了生成和现有对象一模一样的对象,因此当我们需要使用一个已经创建完毕的对象来初始化一个新对象时就可以调用拷贝构造函数

#include<iostream>
using namespace std;class person {
public://1.使用一个已经创建完毕的对象来初始化一个新对象person(int age) {cout << "person有参构造函数调用" << endl;m_age = age;}person(const person& p) {cout << "person拷贝构造函数调用" << endl;m_age = p.m_age;}~person() {cout << "person析构函数调用" << endl;}int m_age;
};void test01() {person p1(20);person p2(p1);cout << "p2的年龄为:" << p2.m_age << endl;
}int main(){test01();return 0;
}

5.默认函数规则

默认情况下,c++编译器至少给一个类添加3个函数:
        1).默认构造函数(无参,函数体为空)
        2).默认析构函数(无参,函数体为空)
        3).默认拷贝构造函数,对属性进行值拷贝
默认构造函数规则如下:
        1).如果用户定义有参构造函数,c++不会提供默认无参构造,但是会提供默认拷贝构造
        2).如果用户定义拷贝构造函数,c++不会再提供其他构造函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法编程题-煎饼排序 不含AAA或者BBB的字符串

算法编程题-煎饼排序 &&不含AAA或者BBB的字符串 煎饼排序原题描述思路简述代码实现复杂度分析 不含AAA或者BBB的字符串原题描述思路简述代码实现复杂度分析 摘要&#xff1a;本文将对两道LeetCode原题进行介绍&#xff0c;分别是煎饼排序和不含AAA或者BBB的字符串。在陈…

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

Vue进阶之单组件开发与组件通信

书接上篇&#xff0c;我们了解了如何快速创建一个脚手架&#xff0c;现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时&#xff0c;要在新建文件夹中打开终端创建一个基本的脚手架&#xff0c;可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组&#xff0c;例如标量就是0维张量&#xff0c;向量就是一维张量&#xff0c;矩阵就是二维张量&#xff0c;而三维张量就可以想象RGB图片&#xff0c;每个channel是一个二维的矩阵&#xff0c;共有三个channel&#xff0…

scss文件内引入其他scss文件报错

在 Sass (SCSS) 中&#xff0c;import 语句用于在当前文件中导入其他 Sass 文件&#xff0c;以便你可以重用样式和变量等。然而&#xff0c;从 Dart Sass 1.23.0 版本开始&#xff0c;import 语句已经被标记为弃用&#xff08;deprecated&#xff09;&#xff0c;并计划在未来的…

Unity3D模型场景等测量长度和角度功能demo开发

最近项目用到多段连续测量物体长度和角度功能&#xff0c;自己研究了下。 1.其中向量角度计算&#xff1a; 需要传入三个坐标来进行计算。三个坐标确定两条向量线段的方向&#xff0c;从而来计算夹角。 public Vector3 SetAngle(Vector3 p1, Vector3 p2,Vector3 p3) { …

【MATLAB】基于RSSI的蓝牙定位与例程,设置4个基站、二维定位

目录 ​编辑 商品描述 主要功能 技术细节 适用场景 下载链接 商品描述 这款基于接收信号强度指示&#xff08;RSSI&#xff09;原理的蓝牙定位程序&#xff0c;专为需要高效、可靠定位解决方案的开发者和研究人员设计。它能够在二维平面内&#xff0c;通过4个锚点实现对未…

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

ROC曲线

文章目录 前言一、ROC的应用&#xff1f;二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中&#xff0c;ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异&#xff0c;例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…

第一届“吾杯”网络安全技能大赛 Writeup

战队信息 战队名称&#xff1a;在你眼中我是誰&#xff0c;你想我代替誰&#xff1f; 战队排名&#xff1a;13 Misc Sign Hex 转 Str&#xff0c;即可得到flag。 原神启动&#xff01; 不好评价&#xff0c;stegsolve 秒了&#xff1a; WuCup{7c16e21c-31c2-439e-a814-b…

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…

基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发&#xff0c;开发过程中采用了OpenCV框架&#xff0c;Sqlite db 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强…

智能化业务校验框架:动态设计与应用实践

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 &#xff08;一&#xff09;商品spu校验信息数据 &#xff08;二&#xff09;商品sku校验信息数据 &#xff08;三&#xff09;组包商品校验信息数据 &#xff08;四&#xff09;商品数据校验数据持有者 &…

idea2024加载flowable6.8.1.36遇到的问题-idea启动flowable问题flowable源码启动问题

代码下载地址&#xff1a; https://gitee.com/hanpenghu_admin_admin/flowable6.8.1.git 1.首先是通过顶层目录maven clean install 发现很多子模块并不会install本地mavenStore库&#xff0c;这导致了&#xff0c;一堆相互依赖的模块报错找不到&#xff0c;所以需要根据报错…

web安全从0到1:burp-suite3

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

深度学习模型: BERT(Bidirectional Encoder Representations from Transformers)详解

一、引言 自然语言处理&#xff08;NLP&#xff09;领域在过去几十年取得了显著的进展。从早期基于规则的方法到统计机器学习方法&#xff0c;再到如今基于深度学习的模型&#xff0c;NLP 不断向着更高的准确性和效率迈进。BERT 的出现为 NLP 带来了新的突破&#xff0c;它能够…

ESP8266 (ESP-01S)烧录固件 和 了解与单片机通信必需的AT指令

ESP8266&#xff08;ESP-01s&#xff09;烧录固件 工具&#xff1a; 需要安装的原装出厂固件库&#xff1a; ESP8266 --接线-- VCC 3.3&#xff08;外接开发板&#xff09; GND GND&#xff08;外接开发板&#xff09; IO0 GND&#xff08;外接…

<三>51单片机PWM开发SG90和超声测距

目录 1,PWM开发SG90 1.1简介 1.2控制舵机 1.3编程实现 2,超声测距 2.1简介 2.2,超声波测距代码实现 1,PWM开发SG90 1.1简介 PWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进 行调制&#xff0c;等…

【Python爬虫五十个小案例】爬取猫眼电影Top100

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1f40d;引言 猫眼电影是国内知名的电影票务与资讯平台&#xff0c;其中Top100榜单是影迷和电影产业观察者关注的重点。通过爬取猫眼电影Top10…