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

【C++面向对象】封装(上):探寻构造函数的幽微之境

 

每文一诗  💪🏼

       我本将心向明月,奈何明月照沟渠  —— 元/高明《琵琶记》

        译文:我本是以真诚的心来对待你,就像明月一样纯洁无瑕;然而,你却像沟渠里的污水一样,对这份心意无动于衷,甚至于不屑一顾。


如果本文对你有所帮助,那能否支持一下老弟呢,嘻嘻🥰

✨✨个人主页 点击✨✨

封装

封装作为C++面向对象的三大特性之一

封装将数据和操作数据的代码组合成一个独立的单元,也就是类。类的成员可以有不同的访问权限,如公有(public)、私有(private)和受保护(protected),以此来控制外部对这些成员的访问。

类的结构

class 类名{ 访问权限: 属性 / 行为 };

  • class类名:指的是类的名称 这个名称可以随意命名例如class hunman
  • 访问权限指的是:如公有(public)、私有(private)和受保护(protected)
  • 属性和行为是指的在这个类当中所定义的变量和方法。

 例如这里定义了一个人类

#include <iostream>
class hunman
{
private:std::string name;
public:hunman();~hunman();
protected:std::string ID_card;
};

struct和class区别

struct默认是公共权限,class默认是私有权限

也就是说在sttruct中定义的变量和方法,可以在外部用该对象直接访问;

而对于Class中定义的变量和方法,如果不指定其权限,默认是无法在外部通过其对象访问的。

构造函数和析构函数

        在C++中,构造函数:是指在这个类当中进行对变量的初始化操作,主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。即在该类的对象被实例化后,构造函数会被立即调用。

        在C++中,析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。例如,当程序中有使用动态内存,即使用new操作符,那么可以在析构函数中进行delete,即内存释放。

构造函数的分类

构造函数的语法是:类名(){}   名称和类名相同,可以重载

  • 无参构造函数:human(){}
  • 有参构造函数:human(std::string name){}
  • 拷贝构造函数:human(const human& h){}

解释:

  • 无参构造函数:是指这个类当中的构造函数不传入任何参数
  • 有参构造函数:是指这个类当中的构造函数传入参数,通常时将传入的参数赋值给类当中的成员变量
  • 拷贝构造函数:传入的参数是和个类的对象,为什么要传入const +引用的形式呢?,是因为我们不想传入的对象被修改,并且以引用的方式传递,这个可以避免被传入的对象占用的内存非常大时,对其的拷贝,使用引用本质上是在使用指针,避免内存的拷贝,提高程序的效率。

构造函数调用规则

  • 括号法
  • 显示法
  • 隐式转换法

 形式1:类名 变量名  hunman p  调用函数:无参构造函数,析构函数

代码

#include <iostream>
class hunman
{
private:std::string name;
public://无参构造函数hunman(){std::cout<<"无参构造函数"<<std::endl;}//有参构造函数hunman(float heightval){height = heightval;std::cout<<"有参构造函数"<<std::endl;}//拷贝构造函数hunman(const hunman& h){height = h.height;std::cout<<"拷贝构造函数"<<std::endl;}//析构函数~hunman(){std::cout<<"析构函数"<<std::endl;       }float height;
protected:std::string ID_card;
};int main(int argc, char const *argv[])
{hunman h;/* code */return 0;
}

 输出

  形式2:类名() 或者 类名 变量名() hunman(1.80) 或者hunman h(1.80);调用函数:有参构造函数,析构函数

代码

#include <iostream>
class hunman
{
private:std::string name;
public://无参构造函数hunman(){std::cout<<"无参构造函数"<<std::endl;}//有参构造函数hunman(float heightval){height = heightval;std::cout<<"有参构造函数"<<std::endl;}//拷贝构造函数hunman(const hunman& h){height = h.height;std::cout<<"拷贝构造函数"<<std::endl;}//析构函数~hunman(){std::cout<<"析构函数"<<std::endl;       }float height;
protected:std::string ID_card;
};int main(int argc, char const *argv[])
{// hunman h;hunman(1.80);/* code */return 0;
}

输出

  形式2:类名 变量名 = 类名(参数)  hunman h1 = hunman(1.80);  调用函数:有参构造函数,析构函数

代码

#include <iostream>
class hunman
{
private:std::string name;
public://无参构造函数hunman(){std::cout<<"无参构造函数"<<std::endl;}//有参构造函数hunman(float heightval){height = heightval;std::cout<<"有参构造函数"<<std::endl;}//拷贝构造函数hunman(const hunman& h){height = h.height;std::cout<<"拷贝构造函数"<<std::endl;}//析构函数~hunman(){std::cout<<"析构函数"<<std::endl;       }float height;
protected:std::string ID_card;
};int main(int argc, char const *argv[])
{// hunman h;// hunman(1.80);hunman h1 = hunman(1.80);// hunman h2 = hunman(h1);/* code */return 0;
}

输出

  形式2:类名 变量名 = 参数 hunman h1 = 1.80;调用函数:有参构造函数,析构函数

代码

#include <iostream>
class hunman
{
private:std::string name;
public://无参构造函数hunman(){std::cout<<"无参构造函数"<<std::endl;}//有参构造函数hunman(float heightval){height = heightval;std::cout<<"有参构造函数"<<std::endl;}//拷贝构造函数hunman(const hunman& h){height = h.height;std::cout<<"拷贝构造函数"<<std::endl;}//析构函数~hunman(){std::cout<<"析构函数"<<std::endl;       }float height;
protected:std::string ID_card;
};int main(int argc, char const *argv[])
{// hunman h;// hunman(1.80);// hunman h1 = hunman(1.80);// hunman h2 = hunman(h1);hunman h1  = 1.80;/* code */return 0;
}

输出:

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

拷贝构造函数

拷贝构造函数的调用

当将一个当前类的对象作为参数传入构造函数中后,就会调用拷贝构造函数

    hunman h;hunman h2 = hunman(h);

 

 这里为什么析构函数调用了两次呢?

很好理解,因为你实例化了两个对象,分别是h,h2。

深拷贝与浅拷贝

这个问题时对于拷贝构造函数的经典问题

浅拷贝:

        是指在定义类时,没有在类中显式的构建拷贝构造函数,将一个类的对象作为参数传入类的构造函数中,编译器会把原对象中栈区的变量的值和堆区指针的值复制,而不复制一个指针指向的值

导致的问题:

        在类执行完成,调用析构函数函数时,并且析构函数中有使用delete对指针进行释放时,会给两个对象中的指针分别释放,而两个对象中指针的值时相同的,就比如说第一个对象中指针的值是0x123,另一个对象中指针的值也是0x123,根据栈区先进后出的原则,后被创建的对象会先进行释放对象中的指针0x123,释放之后,另一个对象中的指针0x123也会被释放,但是这时就会报错,因为0x123这个指针已经被释放过了。

代码演示 (先看一下没有构建拷贝构造函数时,栈区和堆区变量是否被复制)

#include <iostream>
class hunman
{
private:std::string name;
public://无参构造函数hunman(){std::cout<<"无参构造函数"<<std::endl;}//有参构造函数hunman(float heightval,int ageval){height = heightval;age = new int(ageval);std::cout<<"有参构造函数"<<std::endl;}//析构函数~hunman(){std::cout<<"析构函数"<<std::endl;       }float height;int *age;
protected:std::string ID_card;
};int main(int argc, char const *argv[])
{hunman h(1.80,23);hunman h2 = hunman(h);std::cout<<"第一个对象中的height的值:"<<h.height<<"  第二个对象中的height的值:"<<h2.height<<std::endl;std::cout<<"第一个对象中的age的值:"<<h.age<<"  第二个对象中的age的值:"<<h2.age<<std::endl;return 0;
}

输出

解析:

        这段代码中比没有构建拷贝构造函数,而这时编译器会默认构建一个,刚才说过栈区和堆区变量会被复制,根据输出可以直观的看到,第一个对象中的栈区变量height和堆区中的age变量所存储的值是相同的。

但是上段代码有些问题,因为我们既然创建了一个指针变量,即动态分配内存,那么就应该手动释放这块内存,即使用delete。

在析构函数中添加

 ~hunman(){if(age != nullptr){delete age;age = nullptr;}std::cout<<"析构函数"<<std::endl;       }

 但是执行后出现问题

        通过图中我们可以看到,第一个析构函数已经成功执行,但是第二个析构函数执行时却发生的报错free(): double free detected in tcache 2

        这个错误提示表明你试图对同一块已经释放的内存进行了多次释放操作,也就是所谓的 “双重释放” 问题

这个双重释放也很好理解,因为在第二个对象对0x123这个地址释放后,原对象再次对这个地址释放是没有用的,因为他已经被释放过了。

注:

 hunman h(1.80,23);原对象h(先进后出,后释放)
 hunman h2 = hunman(h);第二个对象h2(先进后出,先释放)

 解决方法:

使用深拷贝

        深拷贝是指在复制对象时,不仅复制对象的基本数据类型的值,还会为对象中的指针成员分配新的内存空间,并将原指针所指向的内存内容复制到新的内存空间中。这样,原对象和拷贝对象的指针成员会指向不同的内存地址。

代码,显式构建拷贝构造函数

    // 拷贝构造函数hunman(const hunman& h){height = h.height;age = new int(*h.age);std::cout<<"拷贝构造函数"<<"地址:"<<std::endl;}

 在拷贝构造函数中对栈区的变量重新复制,并且对堆区的指针重新分配内存,使其和原对象中的指针的值不是一个地址,这样第二个对象释放一个地址,而另一个对象释放里一个地址,这样互不干涉,程序就不会崩溃了。

由图可知,两个对象当中的age的值即地址是不一样的,完美解决!

注:在显式的构建拷贝构造函数时,在函数中应该对需要复制的值手动赋值,因为在没有构建拷贝苟造函数时,编译器会帮你把所有的变量复制,但是当你显式构建是,就没了,所以需要手动复制。

构造函数初始化列表

使用构造函数初始化列表可以帮助我们快速的初始化成员变量

语法:类名(参数1,参数2,...): 成员变量1(参数1),成员变量2(参数2),...

#include <iostream>
class hunman
{
public://构造函数初始化列表hunman(int a,float b,std::string c): age(a),height(b),name(c){std::cout<<"age:"<<age<<std::endl;std::cout<<"height:"<<height<<std::endl;std::cout<<"name:"<<name<<std::endl;}int age;float height;std::string name;
};int main(int argc, char const *argv[])
{hunman(21,1.80,"rqtz");return 0;
}

类对象作为类成员

当有另一个类a的对象作为类h的成员变量时候,构造函数和析构函数的调用顺序

构造函数顺序 :先a后h

析构函数顺序:先h后a

代码

#include <iostream>
class animal
{public:animal(){std::cout<<"animal无参构造函数"<<std::endl;}~animal(){std::cout<<"animal析构函数"<<std::endl;}};
class hunman
{
public://无参构造函数hunman(){std::cout<<"hunman无参构造函数"<<std::endl;}~hunman(){std::cout<<"hunman析构函数"<<std::endl;}animal a;
};int main(int argc, char const *argv[])
{hunman h;return 0;
}

 

静态成员

在类中使用 static关键字所修饰的变量和函数叫做类的静态成员

  • 静态成员不属于任何对象
  • 该类的任何对象共用一分数据,共享一块内存
  • 该类的任何对象都可以修改静态成员的值,并且该值会被更新
  • 静态成员的初始化需要在类外,使用类名加作用域的方式初始化
#include <iostream>class hunman
{
public://无参构造函数hunman(){// std::cout<<"hunman无参构造函数"<<std::endl;}~hunman(){// std::cout<<"hunman析构函数"<<std::endl;}static void func(){std::cout<<"静态成员函数"<<std::endl;}static int a;
};
//类外初始化
int hunman::a = 1;
int main(int argc, char const *argv[])
{hunman h;std::cout<<h.a<<std::endl;//其他对象改变静态变量的值班hunman h2;h2.a = 10;//在用原对象访问时,值已经更新std::cout<<h.a<<std::endl;//通过类名加作用域访问静态变量和静态成员函数std::cout<<hunman::a<<std::endl;hunman::func();//该类的对象静态变量时统一快内存std::cout<<&h2.a<<std::endl;std::cout<<&hunman::a<<std::endl;return 0;
}

输出:

 

 

  🔥🔥个人主页 🔥🔥

相关文章:

【C++面向对象】封装(上):探寻构造函数的幽微之境

每文一诗 &#x1f4aa;&#x1f3fc; 我本将心向明月&#xff0c;奈何明月照沟渠 —— 元/高明《琵琶记》 译文&#xff1a;我本是以真诚的心来对待你&#xff0c;就像明月一样纯洁无瑕&#xff1b;然而&#xff0c;你却像沟渠里的污水一样&#xff0c;对这份心意无动于衷&a…...

物联网|无人自助台球厅源码|哪些框架支持多设备连接?

在无人自助台球厅的智能化管理中&#xff0c;物联网&#xff08;IoT&#xff09;技术是核心支撑。如何实现不同设备&#xff08;如智能门锁、环境传感器、支付终端、灯光控制系统等&#xff09;的高效连接与协同工作&#xff0c;是系统开发的关键挑战。本文将带大家探讨支持多设…...

单旋翼无人机(直升机)和四旋翼无人机优势对比

以下是无人机直升机&#xff08;单旋翼无人机&#xff09;与四旋翼无人机的优势对比分析&#xff0c;分场景阐述两者的核心差异&#xff1a; ‌一、无人机直升机&#xff08;单旋翼无人机&#xff09;的优势‌ ‌1. 高能量效率&#xff0c;长续航‌ ‌动力设计‌&#xff1a;单…...

微服务之间调用外键“翻译”的方法概述

写在前面的话&#xff1a;减少strean流操作&#xff0c;减少多层嵌套for循环。使用普通for循环和map的方式进行转换&#xff0c; 第一步查询数据 List<Student> findList studentDao.findList(findMap); 第二步准备遍历和赋值 if(CollectionUtil.isNotEmpty(findLis…...

Java学习——day25(多线程基础与线程创建方式)

文章目录 1. 多线程基础1.1 线程的概念1.2 线程的生命周期 2. 创建线程的方式2.1 继承 Thread 类2.2 实现 Runnable 接口 3. 实践&#xff1a;编写简单多线程程序4. 总结与思考 1. 多线程基础 1.1 线程的概念 线程 (Thread)&#xff1a; 程序执行的最小单元&#xff0c;一个进…...

2025前端面试题

Vue 3 比 Vue 2 更快的原因 Vue 3 使用 JavaScript 的 Proxy 替代了 Vue 2 中的 Object.defineProperty 来实现响应式系统。Proxy 可以拦截对象的所有操作&#xff0c;无需像 Object.defineProperty 那样单独定义每个属性的 getter 和 setterVue 3 还引入了静态树提升&#xf…...

2025-04-09 吴恩达机器学习6——神经网络(1):介绍

文章目录 1 神经网络介绍1.1 起源与发展1.2 生物神经元 vs. 人工神经元1.3 学习建议 2 案例&#xff1a;T 恤预测2.1 基础概念2.2 需求预测示例2.3 多隐藏层神经网络2.4 神经网络的优势 3 案例&#xff1a;图像感知3.1 计算机视觉任务3.2 神经网络架构 1 神经网络介绍 1.1 起源…...

Win11新功能更新:中文语音控制、游戏体验提升、锁屏更多广告

近日&#xff0c;微软在Windows 11发布预览版&#xff08;Insider Release Preview Channel&#xff09;中公布了即将正式推送的一系列新功能。这些更新体现了微软“持续创新”策略——不再依赖传统大型版本更新&#xff0c;而是以更高频率为用户带来功能改进。这一波新功能覆盖…...

Cursor编程-从入门到精通__0409

早期的Github Copilot 最近更新了&#xff0c;支持Agent编程&#xff0c;字节跳动Trae使用&#xff08;免费&#xff09;&#xff0c;但成熟程度不如Cursor&#xff0c;Cursor前50次免费 Copilot VS Cursor*** 1&#xff0c;Cursor VSCode 二次开发&#xff0c;IDE级别 2&…...

【Leetcode-Hot100】移动零

题目 解答 首先&#xff0c;使用的解题思路是&#xff1a;使用两个指针&#xff0c;分别指向数组的第一个0元素位置&#xff0c;以该元素位置1为起始点寻找接下来第一个非0元素位置。二者确定后&#xff0c;对其进行交换。随后继续寻找下一个0元素位置。重复上述操作。 但第一…...

【力扣hot100题】(079)划分字母区间

感觉智商又回来了&#xff08;松气&#xff09;。 方法大概是先建立哈希表遍历数组记录每一个字母位置的跨度&#xff0c;然后再遍历数组&#xff0c;每次遇到跨度大于目前长度的字母&#xff0c;就将目前长度延申跨度的长度&#xff0c;然后继续遍历&#xff0c;知道位置已经…...

更改CMD背景图片

1.下载microsoft powershell 总之,电脑里面要有microsoft powershell这个应用 如下所示 进入界面后, 依次点击命令提示符和外观。 进入后,修改背景图片 2. 查看最终效果 最终我们打开CMD界面, 然后查看。 最终结果大功告成...

如何利用AI工具进行抠图

软件介绍 AIArty Image Matting是一款AI抠图软件&#xff0c;为了方便大家使用&#xff0c;我已经将软件所需的模型下载好。 首先要进行软件安装并运行&#xff0c;之后将“model”压缩包解压&#xff0c;把解压后的文件复制粘贴到“C:\ProgramData\Aiarty\ImageMatting”文件…...

一个很好用的vue2在线签名组件

在前端开发的日常工作中&#xff0c;我们常常会遇到需要用户进行在线签名的需求&#xff0c;比如电子合同签署、表单确认等场景。最近&#xff0c;我在项目里使用了一款极为好用的 Vue2 在线签名组件&#xff0c;今天就来和大家分享一下使用心得。 效果图 上代码 在 views 下…...

软考高级-系统架构设计师 案例题-软件架构设计

文章目录 软件架构设计质量属性效用树&#xff0c;质量属性判断必背概念架构风格对比MVC架构J2EE四层结构面向服务架构SOA企业服务总线ESB历年真题【问题1】 &#xff08;12分)【问题2】&#xff08;13分&#xff09; 参考答案历年真题【问题1】&#xff08;12分&#xff09;【…...

计算机网络笔记-分组交换网中的时延

一、分组交换网络中的四种时延类型 1. 排队时延 在队列中&#xff0c;当分组在链路上等着被传输时的时延为排队时延&#xff0c;一个分组的排队时延长度取决于该分组前方等待传输的分组数量&#xff0c;如果排队队列为空&#xff0c;且没有正在传输的分组那么该分组的排队时延…...

数据结构与算法-图论-复习2(差分约束,强连通分量,二分图,LCA,拓扑排序,欧拉路径和欧拉回路)

7. 差分约束 原理 差分约束系统是一种特殊的不等式组&#xff0c;形如 xi​−xj​≤c。可以将其转化为图论中的最短路或最长路问题。 最短路求最大值&#xff1a;当我们要找出满足所有不等式的最大解时&#xff0c;使用最短路算法。对于不等式 xi​−xj​≤c&#xff0c;可以…...

git强制更新本地分支

你的需求是希望 自动拉取所有远程分支&#xff0c;并且在分支间存在冲突时 自动覆盖本地内容&#xff08;不保留差异&#xff09;。以下是优化后的解决方案&#xff1a; 最终解决方案&#xff08;全自动强制覆盖&#xff09; git fetch --all && for branch in $(git …...

PH热榜 | 2025-04-09

1. EZsite AI 标语&#xff1a;构建能够秒级产生收入的人工智能应用。 介绍&#xff1a;EZsite AI 让任何人都能轻松创建专业的网站和应用&#xff0c;不需要编写代码。它自动保存您的数据库信息&#xff0c;内置的 AI 聊天机器人能帮助您捕获潜在客户&#xff0c;并且通过 A…...

进度管理__制订进度计划_资源平衡和资源平滑

本文讲解的资源平衡与资源平滑&#xff0c;是制订进度计划的工具与技术的第3项&#xff1a; 资源优化。 1. 资源平衡 资源平衡是为了在资源需求与资源供给之间取得平等&#xff0c; 根据资源制约因素对开始日期和完成日期进行调整的一种技术。 如果共享资源或关键资源只在特定…...

【力扣hot100题】(080)爬楼梯

让我们掌声恭迎动态规划的始祖—— 最基础的动态规划&#xff0c;原始方法是维护一个数组&#xff0c;每次记录到该阶梯的方案数量&#xff0c;每次的数量是到上一个阶梯的方案数量加上到上上一阶梯的方案数量&#xff0c;因为只有两种走法。 进阶可以优化空间复杂度&#xf…...

redis_exporter服务安装并启动

redis_exporter服务安装并启动 1、介绍2、下载redis_exporter3、解压缩文件4、启动redis_exporter服务 1、介绍 Redis Exporter 是 Prometheus 官方推荐的 Redis 监控数据导出工具&#xff0c;用于将 Redis 实例的性能指标暴露为 Prometheus 可抓取的格式。 2、下载redis_exp…...

Spring Security 的核心配置项详解,涵盖认证、授权、过滤器链、HTTP安全设置等关键配置,结合 Spring Boot 3.x 版本最佳实践

以下是 Spring Security 的核心配置项详解&#xff0c;涵盖认证、授权、过滤器链、HTTP安全设置等关键配置&#xff0c;结合 Spring Boot 3.x 版本最佳实践&#xff1a; 1. 核心注解与配置类 (1) 启动安全配置 // 启动Web安全配置&#xff08;推荐方式&#xff09; Configura…...

Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解,结合用户描述的关键点展开说明,并以表格总结

以下是 Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解&#xff0c;结合用户描述的关键点展开说明&#xff0c;并以表格总结&#xff1a; 1. Spring Security 核心原理 Spring Security 通过 Filter 链 实现安全控制&#xff0c;其核心流程如下&#xff1a…...

[leetcode]判断质数

一.判断质数 1.1 什么是质数 质数&#xff08;素数&#xff09;就是只可以被自己和1整除的数叫做素数/质数 1.2判断方法 #include<bits/stdc.h> using namespace std; bool isPrime(int num) { if(num < 1) { return false;//a number less of …...

【结肠息肉AI论文集】Cross-level Feature Aggregation Network for Polyp Segmentation

标注&#xff1a;同样是一期结肠息肉论文写作评鉴 摘要 从结肠镜图像中准确分割息肉在结直肠癌的诊断和治疗中起着关键作用。尽管在息肉分割领域已经取得了一定的成效&#xff0c;但仍存在诸多挑战。息肉通常具有多种大小和形状&#xff0c;并且息肉与其周围区域之间没有明显…...

Redis缓存之预热、击穿、穿透、雪崩

面试切入点 缓存预热 什么是预热&#xff1f; mysql假如新增100条记录&#xff0c;一般默认以mysql为准作为底单数据&#xff0c;如何同步到redis(布隆过滤器)&#xff0c;这100条合法数据&#xff1f;&#xff1f; 为什么需要预热&#xff1f; mysql有100条新记录&#xff0…...

C++字符串复习

C字符串复习 前言 为了保证复习高效&#xff0c;以下不包括很简单的内容&#xff0c;例如cin。 C类型字符、字符串 输入方法 **char c getchar()**输入单个字符 string类型字符串 输入方法 getline(cin, str) 整行输入 常用方法 s.substr(pos, len)&#xff1a;截取字…...

centos7安装mysql5.7.44

一、下载 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 二、安装 1、解压 tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 2、创建mysql用户组和用户 # 创建mysql用户组 groupadd mysql# 创建用户并添加到mysql用户组中 useradd -r -g m…...

内存分配中的堆(Memory Heap)详解

在计算机科学中&#xff0c;"堆"这个术语确实容易让人混淆&#xff0c;因为它同时用于描述两种完全不同的概念&#xff1a;数据结构中的堆和内存管理中的堆。上次我们讨论了数据结构中的堆&#xff0c;今天我将详细解释内存分配中的堆&#xff08;Memory Heap&#x…...

【大模型理论篇】关于生成式模型中联合分布概率学习必要性以及GPT是生成式模型的讨论

1. 背景 之前我们在《生成式模型与判别式模型对比(涉及VAE、CRF的数学原理详述)》以及《生成式模型算法原理深入浅出&#xff08;涉及Stable Diffusion、生成对抗网络、高斯混合模型、隐马尔可夫模型、朴素贝叶斯等算法原理分析及生成式模型解释&#xff09;》中&#xff0c;我…...

LeetCode738☞单调递增的数字

关联LeetCode题号738 本题特点 贪心&#xff0c;贪心在如果非单调递增&#xff0c;则想要保证数字整体最大&#xff0c;那低数位一定为9&#xff08;所有数字中最大的&#xff09; 本题思路 从后向前遍历&#xff0c;如果递增则 什么都不做如果非递增&#xff0c;增非递增位…...

本节课课堂总结

课堂总结&#xff1a; Spark运行架构&#xff1a; 运行架构&#xff1a; Spark 框架的核心是一个计算引擎&#xff0c;整体来说&#xff0c;它采用了标准 master-slave 的结构。 如下图所示&#xff0c;它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master&…...

MyBatis中特殊符号处理总结

前言 MyBatis 是一款流行的Java持久层框架&#xff0c;广泛应用于各种类型的项目中。因为我们在日常代码 MyBatis 动态拼接语句时&#xff0c;会经常使用到 大于(>,>)、小于(<,<)、不等于(<>、!)操作符号。由于此符号包含了尖括号&#xff0c;而 MyBatis 使用…...

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解&#xff08;附渗透测试示例&#xff09; 一、DVWA靶场简介 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是专为网络安全学习者设计的漏洞演练平台&#xff0c;包含SQL注入、XSS、文件包含等10大Web漏洞模块&…...

若依前后端分离版本从mysql切换到postgresql数据库

一、修改依赖&#xff1a; 修改admin模块pom.xml中的依赖,屏蔽或删除mysql依赖&#xff0c;增加postgresql依赖。 <!-- Mysql驱动包 --> <!--<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> &l…...

【补题】Codeforces Round 974 (Div. 3) E. Rendez-vous de Marian et Robin

题意&#xff1a;给个图&#xff0c;两个人分别从点1和点n出发&#xff0c;问最早在哪个点可以相遇&#xff0c;其中某些点有马&#xff0c;骑上去之后可以在接下来剩余的时间内都可以将路程所需时间缩短一半。 关于题目数据见原题&#xff0c;这里说明太累了想偷懒Problem - 2…...

MySQL集群技术

当有数据时添加slave2 #从master节点备份数据 mysqldump -uroot -ptiminglee 1 > timinglee.sql 生产环境中备份时需要锁表&#xff0c;保证备份前后的数据一致 mysql> FLUSH TABLES WITH READ LOCK; 备份后再解锁 mysql> UNLOCK TABLES; mysqldump命令备份的数…...

Java 中的字节码

&#x1f50d; 什么是 Java 字节码&#xff08;Bytecode&#xff09;&#xff1f; 字节码是 Java 源码&#xff08;.java 文件&#xff09;被编译后生成的中间代码&#xff08;.class 文件&#xff09;&#xff0c;它不是机器码&#xff0c;而是一种 面向 JVM 的指令集。 可以…...

json 转 txt 用于 yolo 训练(可适用多边形标注框_python)

json 转 txt 用于 yolo 训练&#xff08;可适用多边形标注框_python&#xff09; import json import os import argparse from tqdm import tqdmdef convert_label_json(json_dir, save_dir, classes):json_paths os.listdir(json_dir)classes classes.split(,)for json_pa…...

SQL注入(SQL Injection)

目录 SQL注入(SQL Injection)是什么SQL注入的危害SQL注入的常见方式1. 经典注入(Error-Based Injection)2. 联合查询注入(Union-Based Injection)3. 时间盲注(Time-Based Blind Injection)4. 布尔盲注(Boolean-Based Blind Injection)5. 堆叠注入(Stacked Queries I…...

智慧厨房的秘密:当大模型遇见智能体

智慧厨房的秘密&#xff1a;当大模型遇见智能体 想象一下&#xff0c;一家餐厅里&#xff0c;顾客点了一份特别定制的菜肴。厨师不仅需要知道如何制作这道菜&#xff0c;还得根据当天的食材情况灵活调整配方&#xff0c;甚至考虑到顾客的口味偏好做出微调。这一切背后&#xf…...

IDEA遇到问题汇总

问题1&#xff1a;【异常】IDEA中报错&#xff1a;无效的目标发行版本 IDEA 报错&#xff1a;无效的源发行版-CSDN博客 【异常】IDEA中报错&#xff1a;无效的目标发行版本-CSDN博客 原因是&#xff1a;版本不兼容不一致&#xff0c;需要修改jdk、maven、以及目标字节码使之相一…...

状态管理组件Pinia 简介与底层原理 、Pinia 与其他状态管理库对比、Vue3 + Element Plus + Pinia 安装配置详解

一、Pinia 简介与底层原理 1. Pinia 简介 Pinia 是 Vue3 官方推荐的状态管理库&#xff0c;由 Vue 核心团队开发&#xff0c;旨在替代 Vue2 的 Vuex。其核心目标是提供一种更简洁、直观的状态管理方案&#xff0c;同时充分利用 Vue3 的响应式系统和 Composition API。 2. 底…...

本地部署 opik

本地部署 opik 1. 安装2. 访问 1. 安装 克隆代码&#xff0c; git clone https://github.com/comet-ml/opik.git使用 Docker compose 启动&#xff0c; cd opik/deployment/docker-compose docker compose up -d2. 访问 启动后&#xff0c;您可以在浏览器中访问 localhost:…...

操作系统之进程与线程的理解(一)

对进程的理解 进程是可以并发执行的程序在某个数据集合上的运行过程&#xff0c;是系统进行资源分配和调度的基本单位。进程由三部分组成&#xff0c;程序&#xff0c;数据和进程控制块&#xff08;简称PCB&#xff09;。简单的说&#xff0c;进程就是程序的一次执行 为确保进…...

JS 箭头函数

只能用于声明函数表达式更简洁。替代匿名函数 设置取消点击事件的默认行为 在这里插入图片描述...

Mb,Kb,byte,bits

1MB1024KB; 1KB1024byte(字节&#xff09;&#xff1b; 1byte8bits&#xff08;位&#xff09;&#xff1b; 小蓝准备用 256MB 的内存空间开一个数组&#xff0c;数组的每个元素都是 32 位 二进制整数&#xff0c;如果不考虑程序占用的空间和维护内存需要的辅助空间&#xf…...

x265 中 aqMode 和 hevcAq 的深度解析与应用技巧

aqMode 和 hevcAq 介绍 在 x265 中基本继承了 x264 中 aqmode 的思想,此外还引入了 hevcAq 算法工具,在 x265_param 结构体中有这两个参数变量开关相关解释。从声明注释可以理解,aqMode 和 x264 中 aqmode 的思想完全相似,也扩展了些功能,属于通用型自适应量化方法,基于 …...

(一)基于云平台微调大模型,以deepseek-coder-6.7b为例

一、租借rtx4090卡并创建示例 如下图&#xff0c;我们进入jupyter界面&#xff0c;然后创建笔记本 二、提前下载好模型到本地 为了节省时间&#xff0c;我们需要提前下好模型deepseek-ai/deepseek-coder-6.7b-instruct&#xff0c;然后再上传到autodl上直接本地加载。 下载方…...