当前位置: 首页 > news >正文

《C++ 构造、拷贝构造与析构函数:对象的诞生、克隆与消逝之旅》

类的6个默认成员函数

  构造函数

是对一个对象实例化时的初始化

例如在C语言中写的堆的时候要初始化StackInit,而c++祖师爷写的构造函数本质上就是自动调用初始化。

 构造函数=默认构造函数+自己写的(符合规定的显示表达式)

注:一般情况下构造函数都需要自己写少数情况下,默认生成就可以用,例如队列。 

写法特点

一、构造函数的函数名与类名相同
二、构造函数无返回值
 这里所说的构造函数无返回值是真的无返回值,而不是说返回值为void。
三、对象实例化时编译器自动调用对应的构造函数
 当你用类创建一个对象时,编译器会自动调用该类的构造函数对新创建的变量进行初始化。
四、构造函数支持重载
 这意味着你可以有多种初始化对象的方式,编译器会根据你所传递的参数去调用对应的构造函数。
五、无参的构造函数、全缺省的构造函数以及我们不写编译器自动生成的构造函数都称为默认构造函数,并且默认构造函数只能有一个
 初学C++时,你可能认为只有当我们不写,编译器自动生成的构造函数才被称为默认构造函数。其实并不是这样的,以下3种都叫做默认构造函数:
 1、我们不写,编译器自动生成的构造函数。
 2、我们自己写的无参的构造函数。
 3、我们自己写的全缺省的构造函数。
总而言之,无需传参就可以调用的构造函数就是默认构造函数

 你有没有这种想法,既然在我们不写的情况下,编译器会自动生成一个构造函数,那我们就没有必要自己写构造函数了。这个是❌的。

例如:

#include <iostream>
using namespace std;
class Date
{
public:void Print(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1; // 编译器将调用自动生成的默认构造函数对d1进行初始化d1.Print();return 0;
}

结果是乱码:

六、如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,若用户显示定义了,则编译器就不再生成

3.默认构造函数

1.⽆参构造函数、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数,都叫做默认构造函 数。但是这三个函数有且只有⼀个存在,不能同时存在

2.⽆参构造函数和全缺省构造函数虽然构成函数重载,但是调⽤时会。存在问题

缺省参数(备胎)-CSDN博客有相关解释

3.总结就是不传实参就能调用的就是就叫默认构造函数

3.1⽆参构造函数

#include<iostream>
using namespace std;
class liu
{
public:
// 1.⽆参构造函数
liu()
{
_year = 1;
_month = 1;
_day = 1;
}
private:
int _year;
int _month;
int _day;
};

3.2全缺省构造函数

#include<iostream>
using namespace std;
class liu
{
public:
// 3.全缺省构造函数
liu(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};

3.3编译器默认⽣成的构造函数

#include<iostream>
using namespace std;
class liu
{
liu(){};
int _year;
int _month;
int _day;
};
int main()
{
liu l1;
return 0;
}

  注意:如果通过⽆参构造函数创建对象时,对象后⾯不⽤跟括号,否则编译器⽆法

 这是一个空的函数,即什么都不做。

默认构造函数也不是空的,这里只是简化一下,不作探讨。

 总结:

1、编译器自动生成的构造函数对内置类型不做处理。
2、对于自定义类型,编译器会再去调用它们自己的默认构造函数。


析构函数 

析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对象中资源的清理释放⼯作。

特点八条

1. 析构函数名是在类名前加上字符~。

 2. ⽆参数⽆返回值。(这⾥跟构造类似,也不需要加void)

 3. ⼀个类只能有⼀个析构函数。若未显式定义,系统会⾃动⽣成默认的析构函数。

4. 对象⽣命周期结束时,系统会⾃动调⽤析构函数。

5. 跟构造函数类似,我们不写编译器⾃动⽣成的析构函数对内置类型成员不做处理,⾃定类型成员会 调⽤他的析构函数。

6. 还需要注意的是我们显⽰写析构函数,对于⾃定义类型成员也会调⽤他的析构,也就是说⾃定义类 型成员⽆论什么情况都会⾃动调⽤析构函数。

7. 如果类中没有申请资源时,析构函数可以不写,直接使⽤编译器⽣成的默认析构函数。

8. ⼀个局部域的多个对象,C++规定后定义的先析构。 给出每一点的实例分析

1. 析构函数名是在类名前加上字符 ~

析构函数的名称是类名前加上 ~ 符号,用于标识该函数是析构函数。

#include <iostream>
class MyClass {
public:// 析构函数~MyClass() {std::cout << "MyClass 析构函数被调用" << std::endl;}
};int main() {MyClass obj;return 0;
}

在上述代码中,~MyClass() 就是 MyClass 类的析构函数。


 2. ⽆参数⽆返回值

析构函数不能有参数,也没有返回值,并且不需要显式指定 void。 


 3. ⼀个类只能有⼀个析构函数。若未显式定义,系统会⾃动⽣成默认的析构函数

#include <iostream>
class MyClass {// 未显式定义析构函数,编译器会自动生成默认析构函数
};int main() {MyClass obj;return 0;
}

在上述代码中,MyClass 类没有显式定义析构函数,编译器会自动生成一个默认的析构函数。


 4. 对象⽣命周期结束时,系统会⾃动调⽤析构函数

#include <iostream>
class MyClass {
public:~MyClass() {std::cout << "MyClass 析构函数被调用" << std::endl;}
};void test() {MyClass obj; // obj 的生命周期在 test 函数结束时结束
}int main() {test();std::cout << "test 函数调用结束" << std::endl;return 0;
}

在 test 函数中,obj 对象的生命周期在 test 函数结束时结束,此时系统会自动调用 MyClass 的析构函数。


5. 跟构造函数类似,我们不写编译器⾃动⽣成的析构函数对内置类型成员不做处理,⾃定类型成员会调⽤他的析构函数 

 如果不显式定义析构函数,编译器生成的默认析构函数对内置类型成员不做处理,对自定义类型成员会调用其析构函数。

#include <iostream>
class InnerClass {
public:~InnerClass() {std::cout << "InnerClass 析构函数被调用" << std::endl;}
};class OuterClass {
private:int num; // 内置类型成员InnerClass inner; // 自定义类型成员
public:// 未显式定义析构函数,使用编译器生成的默认析构函数
};int main() {OuterClass obj;return 0;
}

 在上述代码中,OuterClass 未显式定义析构函数,编译器生成的默认析构函数对 num 不做处理,对 inner 会调用 InnerClass 的析构函数。


 6.即使显式定义析构函数,自定义类型成员也会自动调用其析构函数。

  

#include <iostream>
class InnerClass {
public:~InnerClass() {std::cout << "InnerClass 析构函数被调用" << std::endl;}
};class OuterClass {
private:InnerClass inner; // 自定义类型成员
public:~OuterClass() {std::cout << "OuterClass 析构函数被调用" << std::endl;}
};int main() {OuterClass obj;return 0;
}

在上述代码中,OuterClass 显式定义了析构函数,在 OuterClass 的析构函数调用后,会自动调用 InnerClass 的析构函数。


7. 如果类中没有申请资源时,析构函数可以不写,直接使⽤编译器⽣成的默认析构函数;如果有资源申请时,⼀定要⾃⼰写析构,否则会造成资源泄漏

如果类中没有申请资源,如 Date 类,可使用默认析构函数;如果有资源申请,如 Stack 类,必须自己写析构函数。

#include <iostream>
// Date 类,没有申请资源
class Date {
private:int year;int month;int day;
public:// 不需要显式定义析构函数,使用默认析构函数
};// Stack 类,申请了资源
class Stack {
private:int* data;int size;
public:Stack() {data = new int[10];size = 0;}~Stack() {delete[] data; // 释放申请的内存std::cout << "Stack 析构函数被调用,释放内存" << std::endl;}
};int main() {Date d;Stack s;return 0;
}

在上述代码中,Date 类没有申请资源,使用默认析构函数;Stack 类申请了动态内存,需要自己写析构函数来释放内存,否则会造成资源泄漏。


 8. ⼀个局部域的多个对象,C++ 规定后定义的先析构

 在一个局部域中,后定义的对象先析构。

#include <iostream>
class MyClass {
private:int id;
public:MyClass(int i) : id(i) {std::cout << "MyClass " << id << " 构造函数被调用" << std::endl;}~MyClass() {std::cout << "MyClass " << id << " 析构函数被调用" << std::endl;}
};int main() {MyClass obj1(1);MyClass obj2(2);return 0;
}

在上述代码中,obj2 后定义,会先析构,输出结果中 MyClass 2 析构函数被调用 会先于 MyClass 1 析构函数被调用 输出。


 拷贝构造

特点六条

果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数 也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。

 1. 拷贝构造函数是构造函数的一个重载

 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类型对象的副本。它是构造函数的一种重载形式。

#include <iostream>
class MyClass {
private:int data;
public:// 普通构造函数MyClass(int val) : data(val) {std::cout << "普通构造函数被调用" << std::endl;}// 拷贝构造函数MyClass(const MyClass& other) : data(other.data) {std::cout << "拷贝构造函数被调用" << std::endl;}
};int main() {MyClass obj1(10);MyClass obj2(obj1); // 调用拷贝构造函数return 0;
}

 

 2. 拷贝构造函数的第一个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语法逻辑上会引发无穷递归调用

拷贝构造函数的第一个参数必须是类类型对象的引用,若使用传值方式会导致无穷递归调用。

#include <iostream>
class MyClass {
private:int data;
public:// 错误示例:传值方式作为拷贝构造函数参数,会引发编译错误// MyClass(MyClass other) : data(other.data) {}// 正确示例:使用引用作为拷贝构造函数参数MyClass(const MyClass& other) : data(other.data) {std::cout << "拷贝构造函数被调用" << std::endl;}
};int main() {MyClass obj1(10);MyClass obj2(obj1); // 调用拷贝构造函数return 0;
}

如果使用传值方式 MyClass(MyClass other),当调用拷贝构造函数时,为了传递 other 参数,又会调用拷贝构造函数,从而导致无穷递归调用。 

c++规定,拷贝构造之前要传值传参。 

 3.当自定义类型对象进行传值传参或传值返回时,会调用拷贝构造函数。

#include <iostream>
class MyClass {
private:int data;
public:MyClass(int val) : data(val) {std::cout << "普通构造函数被调用" << std::endl;}MyClass(const MyClass& other) : data(other.data) {std::cout << "拷贝构造函数被调用" << std::endl;}
};// 传值传参
void func(MyClass obj) {// 函数体
}// 传值返回
MyClass createObj() {MyClass obj(10);return obj;
}int main() {MyClass obj1(10);func(obj1); // 传值传参,调用拷贝构造函数MyClass obj2 = createObj(); // 传值返回,调用拷贝构造函数return 0;
}

 

 在上述代码中,func 函数的传值传参和 createObj 函数的传值返回都会调用拷贝构造函数。

 4. 若未显式定义拷贝构造,编译器会自动生成拷贝构造函数。

自动生成的拷贝构造对内置类型成员变量会完成值拷贝 / 浅拷贝 (一个字节一个字节的拷贝),对自定义类型成员变量会调用他的拷贝构造

 

#include <iostream>
class InnerClass {
private:int innerData;
public:InnerClass(int val) : innerData(val) {std::cout << "InnerClass 普通构造函数被调用" << std::endl;}InnerClass(const InnerClass& other) : innerData(other.innerData) {std::cout << "InnerClass 拷贝构造函数被调用" << std::endl;}
};class OuterClass {
private:int outerData;InnerClass inner;
public:OuterClass(int outerVal, int innerVal) : outerData(outerVal), inner(innerVal) {std::cout << "OuterClass 普通构造函数被调用" << std::endl;}// 未显式定义拷贝构造函数,使用编译器自动生成的拷贝构造函数
};int main() {OuterClass obj1(10, 20);OuterClass obj2(obj1); // 调用编译器自动生成的拷贝构造函数return 0;
}

 在上述代码中,OuterClass 未显式定义拷贝构造函数,编译器自动生成的拷贝构造函数会对 outerData 进行值拷贝,对 inner 调用 InnerClass 的拷贝构造函数。

 6.并不是所有内置类型都能用拷贝构造的

例如:栈Stack,是内置类型;

现在来拷贝构造,发现报错了,这是为什么呢。

错误原因分析

  1. 默认拷贝构造函数的问题:在 main 函数中执行 Stack st2(st1); 时,由于没有自定义拷贝构造函数,编译器会生成一个默认的拷贝构造函数。默认拷贝构造函数只会进行浅拷贝,即简单地将 st1 中成员变量的值复制给 st2 。对于 _a 这个指针成员变量,浅拷贝后 st1._a 和 st2._a 指向同一块堆内存。

  2. 析构函数的重复释放:当程序结束时,st1 和 st2 会依次调用析构函数。由于它们的 _a 指针指向同一块内存,第一次调用析构函数(比如 st1 的析构函数)时释放了这块内存,当 st2 调用析构函数时,再次对已经释放的内存调用 free ,就会导致运行时错误。

  3. 需要自己写拷贝构造
    // 自定义拷贝构造函数Stack(const Stack& other){_capacity = other._capacity;_top = other._top;_a = (int*)malloc(sizeof(int) * _capacity);if (nullptr == _a){perror("malloc申请空间失败");return;}for (size_t i = 0; i < _top; ++i){_a[i] = other._a[i];}}

    总结: 传值返回会产生一个临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名 (引用),没有产生拷贝。但是如果返回对象是一个当前函数局部域的局部对象,函数结束就销毁了,那么使用引用返回是有问题的,这时的引用相当于一个野引用,类似一个野指针一样。传引用返回可以减少拷贝,但是一定要确保返回对象,在当前函数结束后还在,才能用引用返回。

相关文章:

《C++ 构造、拷贝构造与析构函数:对象的诞生、克隆与消逝之旅》

类的6个默认成员函数 构造函数 是对一个对象实例化时的初始化 例如在C语言中写的堆的时候要初始化StackInit&#xff0c;而c祖师爷写的构造函数本质上就是自动调用初始化。 构造函数默认构造函数自己写的&#xff08;符合规定的显示表达式&#xff09; 注&#xff1a;一般情况下…...

uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!

此文章懒得排版了&#xff0c;为了找出这个bug, 星期六的晚上我从9点查到0点多&#xff0c;此时我心中一万个草泥马在崩腾&#xff0c;超级想骂人&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; uniCloud 不想…...

【论文阅读】VAD: Vectorized Scene Representation for Efficient Autonomous Driving

一、介绍 VAD是华科团队设计的一个端到端无人驾驶框架&#xff0c;针对传统的无人驾驶框架的模块化设计的问题&#xff0c;该算法使用向量化的策略进行了端到端的实现。传统的模块化设计使得感知模块完全依赖于感知模块的计算结果&#xff0c;这一解耦实际上从规划模块的角度损…...

uniapp版本加密货币行情应用

uniapp版本加密货币行情应用 项目概述 这是一个使用uniapp开发的鸿蒙原生应用&#xff0c;提供加密货币的实时行情查询功能。本应用旨在为用户提供便捷、实时的加密货币市场信息&#xff0c;帮助用户随时了解市场动态&#xff0c;做出明智的投资决策。 应用采用轻量级设计&a…...

使用 Java 执行 SQL 语句和存储过程

使用 Java 执行 SQL 语句和存储过程&#xff0c;通常有两种主要的方式&#xff1a;使用 JDBC&#xff08;Java Database Connectivity&#xff09;或者通过框架如 Spring Data JPA、MyBatis 等。 1. 使用 JDBC 执行 SQL 语句 JDBC 是 Java 操作数据库的标准 API。以下是通过 …...

算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式

在算法学习中&#xff0c;深度优先搜索&#xff08;DFS&#xff09;是一种常用的图搜索算法&#xff0c;通过递归或栈实现&#xff0c;适合路径搜索、连通性、拓扑排序、回溯、生成、环路检测、强连通分量和可达性等问题。本文将介绍如何利用深度优先搜索解决“妖怪和尚过河问题…...

大白话JavaScript闭包实现原理与在实际开发中的应用场景

大白话JavaScript闭包实现原理与在实际开发中的应用场景 答题思路 解释闭包的概念&#xff1a;先简单直白地说明闭包是什么&#xff0c;让读者对闭包有一个初步的认识。阐述闭包的实现原理&#xff1a;详细讲解闭包是如何形成的&#xff0c;涉及到函数作用域、变量的生命周期…...

【redis】数据类型之geo

Redis的GEO数据类型用于存储地理位置信息&#xff08;如经纬度&#xff09;&#xff0c;并提供高效的地理位置查询功能&#xff08;如计算两地距离、搜索附近地点等&#xff09;。其底层基于Sorted Set&#xff08;有序集合&#xff09;实现&#xff0c;通过Geohash编码将经纬度…...

C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?

一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域&#xff0c;特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线&#xff0c;涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20&#xff1a;使用现代C特性&#xff0c;如…...

第五次CCF-CSP认证(含C++源码)

第五次CCF-CSP认证 第一道&#xff08;easy&#xff09;思路及AC代码 第二道&#xff08;easy&#xff09;思路及AC代码solution 1solution 2 第三道&#xff08;mid&#xff09;思路及AC代码&#xff08;mid&#xff09; 第一道&#xff08;easy&#xff09; 题目链接 思路及…...

tcp udp区别

TCP&#xff08;传输控制协议&#xff09; 和 UDP&#xff08;用户数据报协议&#xff09; 是两种常用的传输层协议&#xff0c;它们在数据传输方式、可靠性和应用场景等方面有显著区别。以下是它们的主要区别&#xff1a; 1. 连接方式 TCP&#xff1a;面向连接的协议。通信前需…...

驱动 AI 边缘计算新时代!高性能 i.MX 95 应用平台引领未来

智慧浪潮崛起&#xff1a;AI与边缘计算的时代 正悄然深植于我们的日常生活之中&#xff0c;无论是火热的 ChatGPT 与 DeepSeek 语言模型&#xff0c;亦或是 Meta 智能眼镜&#xff0c;AI 技术已经无形地影响着我们的生活。这股变革浪潮并未停歇&#xff0c;而是进一步催生了更高…...

【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…...

Linux 进程管理工具 Supervisor

介绍 Supervisor 是一个用 Python 编写的进程管理工具&#xff0c;旨在帮助你监控和控制多个进程。它特别适用于需要确保某些服务在服务器启动时自动运行&#xff0c;并且在崩溃时自动重启的场景。 写在前面&#xff1a; 因为现在很多第三方的包的最新版本都是基于 python3了…...

问题解决:AttributeError: ‘NoneType‘ object has no attribute ‘text‘

项目环境&#xff1a; 我的环境&#xff1a;Window10&#xff0c;Python3.12&#xff0c;Anaconda3&#xff0c;Pycharm2024.3.4 问题描述&#xff1a; 找不到’text’这个对象 部分代码&#xff1a; Traceback (most recent call last):File "D:\IT DateFiles\PyDate\FQ…...

Hadoop、Hive、Spark的关系

Part1&#xff1a;Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架&#xff0c;一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程&#xff0c;map将一个任务分成多个小任务&#xff0c;reduce的部分将结果汇总之后返回。 3、HIv…...

OneM2M:全球性的物联网标准-可应用于物联网中

OneM2M 是一个全球性的物联网(IoT)标准,旨在为物联网设备和服务提供统一的框架和接口,以实现设备之间的互操作性、数据共享和服务集成。OneM2M 由多个国际标准化组织(如 ETSI、TIA、TTC、ARIB 等)共同制定,目标是解决物联网领域的碎片化问题,提供一个通用的标准,支持跨…...

C++类和对象入门(三)

目录 前言 一、初始化列表 1.1定义 1.2 格式和语法 1.3与在函数内初始化的区别 1.4使用初始化列表的必要性 1.5成员变量默认值的使用&#xff08;C11&#xff09; 1.6初始化的先后顺序 1.7初始化列表的总结 二、类型转换 2.1内置类型转化成类类型 2.2类类型之间的相…...

Ubuntu 下 Docker 企业级运维指南:核心命令与最佳实践深度解析20250309

Ubuntu 下 Docker 企业级运维指南&#xff1a;核心命令与最佳实践深度解析 在当今的数字化时代&#xff0c;Docker 已成为企业应用部署和运维的基石。其轻量级、高效且灵活的容器化技术&#xff0c;为企业带来了前所未有的敏捷性和可扩展性。然而&#xff0c;随着容器化应用的…...

Tensorflow 2.0 GPU的使用与限制使用率及虚拟多GPU

Tensorflow 2.0 GPU的使用与限制使用率及虚拟多GPU 1. 获得当前主机上特定运算设备的列表2. 设置当前程序可见的设备范围3. 显存的使用4. 单GPU模拟多GPU环境 先插入一行简单代码&#xff0c;以下复制即可用来设置GPU使用率&#xff1a; import tensorflow as tf import numpy…...

【PyCharm】Python和PyCharm的相互关系和使用联动介绍

李升伟 整理 Python 是一种广泛使用的编程语言&#xff0c;而 PyCharm 是 JetBrains 开发的专门用于 Python 开发的集成开发环境&#xff08;IDE&#xff09;。以下是它们的相互关系和使用联动的介绍&#xff1a; 1. Python 和 PyCharm 的关系 Python&#xff1a;一种解释型、…...

动态规划:多重背包

本题力扣上没有原题&#xff0c;大家可以去卡码网第56题 (opens new window)去练习&#xff0c;题意是一样的。 56. 携带矿石资源&#xff08;第八期模拟笔试&#xff09; 题目描述 你是一名宇航员&#xff0c;即将前往一个遥远的行星。在这个行星上&#xff0c;有许多不同类…...

AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异

背景 字节跳动正式发布中国首个AI原生集成开发环境工具&#xff08;AI IDE&#xff09;——AI编程工具Trae国内版。 该工具模型搭载doubao-1.5-pro&#xff0c;支持切换满血版DeepSeek R1&V3&#xff0c; 可以帮助各阶段开发者与AI流畅协作&#xff0c;更快、更高质量地完…...

TensorFlow 的基本概念和使用场景

TensorFlow 是一个由 Google 开发的开源深度学习框架&#xff0c;用于构建和训练机器学习模型。它的基本概念包括以下几点&#xff1a; 张量&#xff08;Tensor&#xff09;&#xff1a;在 TensorFlow 中&#xff0c;数据以张量的形式表示&#xff0c;张量可以是多维数组&#…...

gRPC学习笔记

微服务 一旦某个服务器宕机&#xff0c;会引起整个应用不可用&#xff0c;隔离性差 只能整体应用进行伸缩&#xff0c;浪费资源&#xff0c;可伸缩性差 代码耦合在一起&#xff0c;可维护性差 微服务架构&#xff1a;解决了单体架构的弊端 可以按照服务进行单独扩容 各个…...

Linux常见指令

Linux常见指令 1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令和rm指令7、man指令8、cp指令9、mv指令10、cat指令11、重定向12、more指令13、less指令14、head指令15、tail指令16、管道17、时间相关指令18、cal指令19、find指令20、grep指令21、zip/unzip指…...

Vue3、vue学习笔记

<!-- Vue3 --> 1、Vue项目搭建 npm init vuelatest cd 文件目录 npm i npm run dev // npm run _ 这个在package.json中查看scripts /* vue_study\.vscode可删 // vue_study\src\components也可删除(基本语法&#xff0c;不使用组件) */ // vue_study\.vscode\lau…...

用OpenCV写个视频播放器可还行?(C++版)

引言 提到OpenCV&#xff0c;大家首先想到的可能是图像处理、目标检测&#xff0c;但你是否想过——用OpenCV实现一个带进度条、倍速播放、暂停功能的视频播放器&#xff1f;本文将通过一个实战项目&#xff0c;带你深入掌握OpenCV的视频处理能力&#xff0c;并解锁以下功能&a…...

clion+arm-cm3+MSYS-mingw +jlink配置用于嵌入式开发

0.前言 正文可以跳过这段 初识clion&#xff0c;应该是2015年首次发布的时候&#xff0c; 那会还是大三&#xff0c;被一则推介广告吸引到&#xff0c;当时还在用vs studio&#xff0c;但是就喜欢鼓捣新工具&#xff0c;然后下载安装试用了clion&#xff0c;但是当时对cmake规…...

物联网-IoTivity:开源的物联网框架

IoTivity 是一个开源的物联网(IoT)框架,旨在为物联网设备提供互操作性、安全性和可扩展性。它由 Open Connectivity Foundation (OCF) 主导开发,遵循 OCF 的标准,致力于实现设备之间的无缝连接和通信。IoTivity 提供了一个统一的框架,支持设备发现、数据交换、设备管理和…...

Acrobat DC v25.001 最新专业版已破,像word一样编辑PDF!

在数字化时代&#xff0c;PDF文件以其稳定性和通用性成为了文档交流和存储的热门选择。无论是阅读、编辑、转换还是转曲&#xff0c;大家对PDF文件的操作需求日益增加。因此&#xff0c;一款出色的PDF处理软件不仅要满足多样化的需求&#xff0c;还要通过简洁的界面和强大的功能…...

【c++】模板进阶

在前面我们学习了模板的基础用法【c】 模板初阶-CSDN博客初步认识了函数模板和类模板&#xff0c;接下来让我们看看模板还有哪些进阶的应用。 非类型模板参数 之前我们用到的模板全都使用了类型参数 类型参数&#xff1a;表示某种数据类型&#xff08;如 int、double、自定义…...

IntelliJ IDEA 2021版创建springboot项目的五种方式

第一种方式&#xff0c;通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式&#xff0c;通过https://start.spring.io官网来直接创建springboot项目压缩包&#xff0c;然后导入至我们的idea中。 点击generate后&#xff0c;即可生成压缩包&#xf…...

数字信号处理之信号功率谱计算welch方法(分段加窗平均周期图)、Bartlett方法(周期图)(Python)

welch方法原理说明 welch方法[1]通过将数据划分为重叠的段&#xff0c;计算每个段的进行修改(加窗)后的周期图&#xff0c;然后对所有段的周期图求和进行平均&#xff0c;得到最终的功率谱密度。 Python和Matlab中均存在welch函数。welch函数通过配置noverlap为0&#xff0c;可…...

【面试】Java 基础

基础 1、Java 中几种基本数据类型什么&#xff0c;各自占用多少字节2、基本数据同包装类的区别3、Java 基本类型的参数传递和引用类型的参数传递有啥区别4、隐式类型转换和显式类型转换5、switch 语句表达式结果的类型6、数组的扩容方式7、面向对象三大特征8、静态变量和成员变…...

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)

IDEA 社区版如何创建 Spring Boot 项目&#xff08;详细教程&#xff09; Spring Boot 以其简洁、高效的特性&#xff0c;成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导&#xff0c;但 社区版&#xff08;Community Edition&#xff09…...

CTFHub-FastCGI协议/Redis协议

将木马进行base64编码 <?php eval($_GET[cmd]);?> 打开kali虚拟机&#xff0c;使用虚拟机中Gopherus-master工具 Gopherus-master工具安装 git clone https://github.com/tarunkant/Gopherus.git 进入工具目录 cd Gopherus 使用工具 python2 "位置" --expl…...

【Python字符串】\n是什么?它与raw字符串、多行字符串的运用有什么关系?

李升伟 整理 在Python中&#xff0c;\n 是换行符&#xff0c;用于在字符串中表示新的一行。当你在字符串中使用 \n 时&#xff0c;Python 会在该位置插入一个换行符&#xff0c;使得输出在 \n 处换行。 1. 普通字符串中的 \n 在普通字符串中&#xff0c;\n 会被解释为换行符…...

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址&#xff0c;每次启动虚拟机服务都是不一样的 IP&#xff0c;因此要配置静态 IP 地址避免每次都发生变化&#xff0c;下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念&#xff1a; 动态 IP…...

git lfs使用方法指南【在github保存100M以上大文件】

为了在 GitHub 仓库中存储超过 100MB 的大文件并避免推送失败&#xff0c;使用 Git LFS&#xff08;Large File Storage&#xff09; 是最佳解决方案。以下是详细步骤&#xff1a; 一、安装 Git LFS 下载并安装 Git LFS&#xff1a; 访问 Git LFS 官网 下载对应系统的安装包。或…...

【Linux】初识线程

目录 一、什么是线程&#xff1a; 重定义线程和进程&#xff1a; 执行流&#xff1a; Linux中线程的实现方案&#xff1a; 二、再谈进程地址空间 三、小结&#xff1a; 1、概念&#xff1a; 2、进程与线程的关系&#xff1a; 3、线程优点&#xff1a; 4、线程…...

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…...

uniapp登录用户名在其他页面都能响应

使用全局变量 1、在APP.vue中定义一个全局变量&#xff0c;然后在需要的地方引用它&#xff1b; <script>export default {onLaunch: function() {console.log(App Launch)this.globalData { userInfo: {} };},onShow: function() {console.log(App Show)},onHide: fu…...

ESP8266 入门(第 2 部分):使用 AT 命令

使用 AT 命令对 WiFi 收发器ESP8266编程 本教程是上一个教程 ESP8266 入门(第 1 部分)的延续。因此,简单回顾一下,在之前的教程中,我们介绍了 ESP 模块,并学习了一些基础知识。我们还使用 FTDI 串行适配器模块制作了一个开发板,该模块可以很容易地用于使用 AT 命令和 A…...

介绍一下Qt 中的QSizePolicy 布局策略

在 Qt 中&#xff0c;QSizePolicy 类用于描述一个控件在布局中如何分配空间&#xff0c;它定义了控件在水平和垂直方向上对空间的需求和响应策略。以下是对 QSizePolicy 策略的详细介绍&#xff1a; 基本概念 QSizePolicy 包含两个主要的属性&#xff1a;Policy&#xff08;策…...

从ETL到数仓分层:大数据处理的“金字塔”构建之道

在当今数据驱动的时代&#xff0c;大数据处理已成为企业决策和业务优化的核心。而ETL&#xff08;Extract, Transform, Load&#xff09;作为数据处理的基石&#xff0c;其背后的数仓分层理念更是决定了数据处理的效率与质量。本文将深入探讨ETL工作中的数仓分层理念&#xff0…...

springBoot集成声明式和编程式事务的方式

一、声明式事务 前提集成了mybatisplus插件 1、pom依赖 <dependencies><!-- MyBatis-Plus 启动器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.4&l…...

前端实现版本更新自动检测✅

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&a…...

Python零基础学习第三天:函数与数据结构

一、函数基础 函数是什么&#xff1f; 想象你每天都要重复做同一件事&#xff0c;比如泡咖啡。函数就像你写好的泡咖啡步骤说明书&#xff0c;每次需要时直接按步骤执行&#xff0c;不用重新想流程。 # 定义泡咖啡的函数 def make_coffee(sugar1): # 默认加1勺糖 print("…...

深入了解Linux —— 调试程序

前言 我们已经学习了linux下许多的工具&#xff0c;vim、gcc、make/makefile等&#xff1b; 已经能够在linux写代码&#xff0c;并且进行编译运行&#xff0c;让程序在linux下跑起来。 但是&#xff0c;如果我们在写代码的时候遇见了错误&#xff1b;但是我们并不知道错误在哪&…...