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

8.3 C++ 定义并使用类

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

使用结构体定义类: 其实使用C语言中的结构体类型,我们可以模拟出一个伪类,虽然很麻烦,但是也凑活着能用.

#include <iostream>using namespace std;struct Student
{char name[64];int age;
};void Print_Student(struct Student *ptr)
{printf("Name: %s --> Age: %d \n", ptr->name, ptr->age);
}int main(int argc, char *argv[])
{struct Student stu;strcpy(stu.name, "lyshark");stu.age = 23;Print_Student(&stu);system("pause");return 0;
}

定义简单的类: 接着我们来定义一个真正的Student类,并调用成员函数实现对数据成员的输出.

#include <iostream>
#include <string>using namespace std;class Student
{
public:int uid;char *name;int age;public:void set(int id, char *name, int age){this->uid = id;this->name = name;this->age = age;}void display(){cout << this->uid << this->name << this->age << endl;}
};void Call(const Student &ptr)
{cout << ptr.name << endl;
}int main(int argc, char *argv[])
{Student stu;                                       // 实例化stu.set(1001, "lyshark", 23);                     // 设置数据cout << stu.uid << stu.name << stu.age << endl;   // 输出stu.display();                                    // 使用成员函数输出Student *ptr = &stu;                              // 使用指针cout << ptr->uid << ptr->name << ptr->age << endl;Call(stu);system("pause");return 0;
}

定义构造/析构函数: 构造函数通常用于初始化类中的数据成员,析构函数则主要负责对类的清理工作.

#include <iostream>
#include <string>using namespace std;class Student
{
public:int uid;char *name;int age;public:Student() { cout << "init .." << endl; }  // 定义无参构造函数Student(int uid, char *name, int age)     // 定义有参构造函数{this->uid = uid;this->name = name;this->age = age;}~Student()                               // 定义析构函数{cout << "执行结束,析构 !" << endl;}void Display(){cout << this->name << endl;}
};int main(int argc, char *argv[])
{class Student *stu_ptr[3];Student stu1(1001, "admin", 22);Student stu2(1002, "guest", 33);Student stu3(1003, "tudyit", 25);stu_ptr[0] = &stu1;stu_ptr[1] = &stu2;stu_ptr[2] = &stu3;for (int x = 0; x < 3; x++)stu_ptr[x]->Display();system("pause");return 0;
}

定义拷贝构造函数: 拷贝构造函数的主要作用就是实现两个类之间的数据成员的克隆.

#include <iostream>
#include <string>using namespace std;class Student
{
public:int uid;char *name;int age;public:Student(int uid, char *name, int age)     // 构造函数{this->uid = uid;this->name = name;this->age = age;}Student(const Student& ptr)             // 拷贝构造函数{this->uid = ptr.uid;                // 实现将传入的参数this->name = ptr.name;              // 拷贝到新的类中this->age = ptr.age;                // 此时两个类就具有相同属性了cout << &ptr << " clone" << endl;}
};int main(int argc, char *argv[])
{Student stu1(1001, "admin", 22);// 如下开辟新对象stu2 -> 将stu1中的数据拷贝到stu2Student stu2(stu1);cout << stu2.name << endl;cout << stu2.age << endl;// 第二种拷贝方式Student stu3 = Student(stu1);cout << stu3.name << endl;system("pause");return 0;
}

使用浅/深拷贝: 浅拷贝主要是对数据成员表层的拷贝,这种拷贝容易出现问题,而深拷贝则是完全对数据的复制.

先来看下面这段代码,该代码就是一个典型的浅拷贝,当代码Student stu2(stu1);拷贝完成后,在执行析构函数时,由于是浅拷贝,数据成员共用一片内存区域,而析构函数则执行了两次,第一次释放后,第二次释放内存则出现冲突的情况.

#include <iostream>using namespace std;class Student
{
public:char * m_name;int m_age;public:Student(char * name, int age){this->m_age = age;this->m_name = (char *)malloc(strlen(name) + 1);strcpy(this->m_name, name);}~Student(){if (m_name != NULL)free(m_name);}
};int main(int argc, char *argv[])
{Student stu1("lyshark", 25);  // 定义数据Student stu2(stu1);           // 调用拷贝构造函数system("pause");return 0;
}

接着看下面的深拷贝代码,我们通过自己开辟堆空间,然后自己在拷贝构造函数中拷贝数据,防止冲突,同样的代码经过简单的的修改,就可以避免拷贝是数据释放的冲突问题.

#include <iostream>using namespace std;class Student
{
public:char * m_name;int m_age;public:Student() { }Student(char * name, int age){this->m_age = age;this->m_name = (char *)malloc(strlen(name) + 1);strcpy(this->m_name, name);}~Student(){if (m_name != NULL)free(m_name);}Student(const Student &ptr)        // 定义拷贝构造函数{this->m_age = ptr.m_age;this->m_name = (char *)malloc(strlen(ptr.m_name) + 1);strcpy(this->m_name, ptr.m_name);  // 深层拷贝}
};int main(int argc, char *argv[])
{Student stu1("lyshark", 25);Student stu2(stu1);system("pause");return 0;
}

构造函数初始化列表: 定义构造函数也可使用初始化列表的形式来对数据赋值,这种方式很简洁,适合简单的构造函数使用.

#include <iostream>using namespace std;class Student
{
public:char * m_name;int m_age;public:// 无参数构造函数的写法Student(){ }// 有参构造函数,使用初始化列表Student(char * x, int y) :m_name(x), m_age(y){}// 普通函数也可写成一行void Show(){ cout << this->m_name << endl; }
};int main(int argc, char *argv[])
{Student stu1("lyshark",24);stu1.Show();system("pause");return 0;
}

new 动态对象创建: 该关键字可用来实例化类,它可以自动分配初始化空间,开辟到堆中,并且自动来维护释放,非常方便.

#include <iostream>using namespace std;class Student
{
public:char * m_Str;public:Student() { cout << "默认构造调用" << endl; }~Student() { cout << "默认析构调用" << endl; }
};int main(int argc, char *argv[])
{// malloc 返回 void* 还必须要强转Student stu1;    // 在栈上开辟的空间// 所有new出来的对象都会返回该类型的指针,并且会调用默认构造函数Student *stu2 = new Student;   // 堆区开辟空间delete stu2;                   // 释放堆区空间// 使用new 来开辟数组,他一定会调用默认构造函数,有多少数组成员就调用多少次!Student *pArray = new Student[10];pArray[0].m_Str = "lyshark";cout << pArray[0].m_Str << endl;delete[] pArray;                 // 释放整个数组,必须加[]中括号system("pause");return 0;
}

静态数据成员: 静态成员变量,无论建立多少个对象,都只有一个静态数据的拷贝,所有对象都共享这个静态数据.

#include <iostream>using namespace std;class Student
{
public:// 静态成员变量必须在类内声明,在类外对其进行初始化static int m_number;    // 定义静态成员变量static char * m_name;   // 定义静态成员变量
};int Student::m_number = 100;         // 类外初始化
char *Student::m_name = "lyshark";   // 类外初始化静态成员变量int main(int argc, char *argv[])
{Student stu1, stu2;// 此处如果对stu1中的静态变量修改后,stu2也会受到影响,两个是共享的数据源stu1.m_number = 200;cout << stu1.m_number << "   " << stu1.m_name << endl;cout << stu2.m_number << "   " << stu2.m_name << endl;cout << "通过类名直接访问:" << Student::m_number << endl;cout << "通过类名直接访问:" << Student::m_name << endl;system("pause");return 0;
}

静态成员函数: 静态成员函数,不可以访问普通的成员变量,仅可以访问通过static修饰的,静态成员变量.

#include <iostream>using namespace std;class Student
{
public:static int m_number;public:static void Display(){cout << m_number << endl;cout << "hello lyshark" << endl;}
};int Student::m_number = 100;         // 类外初始化int main(int argc, char *argv[])
{Student stu1, stu2;stu1.Display();  // 调用两个函数返回值相同stu2.Display();  // 两个成员函数就是一个system("pause");return 0;
}

关于this指针: 该指针是默认存在于类中的,由编译器维护,this指针指向被调用的成员函数所属的对象.

#include <iostream>
#include <string>using namespace std;class Person
{
public:char *name;int age;public:Person(char *p_name, int p_age) { this->name = p_name; this->age = p_age; }void Compare_Age(Person & ptr)          // 对比年龄是否相等{if (this->age == ptr.age)cout << "Same age" << endl;     // 年龄相同elsecout << "Same not age" << endl; // 年龄不同}void PlusAge(Person & ptr)              // 两个年龄相加{this->age += ptr.age;}Person & Push_Age(Person &ptr){this->age += ptr.age;return *this;                       // 返回指向对象本体}};int main(int argc, char *argv[])
{Person per1("lyshark", 33);Person per2("admin", 33);per1.Compare_Age(per2);      // 判断两个类年龄是否相等per1.PlusAge(per2);          // 将两个年龄相加cout << per1.age << endl;    // 输出年龄per1.Push_Age(per2).Push_Age(per2);  // 链式编程(必须传递引用)cout << per1.age << endl;system("pause");return 0;
}

空指针访问成员函数: 如下定义空指针,并尝试使用空指针访问类,那么如果类中没有判断空指针的语句,则程序会崩溃.

#include <iostream>using namespace std;class Person
{
public:int m_age;public:void show() { cout << "person show" << endl; }void show_age()   // 此处如果没有if判断,则程序会报错{if (this == NULL)   // 防止使用空指针访问return;cout << "show: " << m_age << endl;}
};int main(int argc, char *argv[])
{// show_age() 默认会加上 this --> 那么如果传递空指针则失败// 代码接收空指针,会溢出,说以在类中进行判断,可以防止空指针错误Person *ptr = NULL;ptr->show();          // 这个可以ptr->show_age();      // 不可以system("pause");return 0;
}

定义常函数/常对象: 使用Const修饰的成员函数,则是常函数,如果用来修饰对象则是常对象,两者均不可直接修改.

#include <iostream>using namespace std;class Person
{
public: int m_x; int m_y;public:Person() { this->m_x = 0; this->m_y = 0; }  // 初始化构造函数void showInfo() const // 声明常函数,函数内部不可以修改指针的指向{// this->m_x = 1000; 相当于修改成了 --> const Person * const this// this->m_x = 200;  常函数无法直接修改cout << this->m_x << endl;}
};int main(int argc, char *argv[])
{// 常函数的调用Person per1;per1.showInfo();// 定义常对象,常对象不允许修改数据,只能调用const Person per2;per2.showInfo();system("pause");return 0;
}

友元函数的定义: 将全局函数定义为友元函数,让外部函数,可以访问特定的类内部的私有数据.

#include <iostream>
#include <string>using namespace std;class Student
{ // 定义友元函数 --> 让goodGay 可以访问我的私有属性friend void goodGay(Student *ptr);
private:string m_badRoom;        // 私有的卧室string m_sittingRoom;    //  私有的客厅public:Student(){this->m_sittingRoom = "客厅";this->m_badRoom = "卧室";}
};// 全局函数,我想让他能访问到私有的卧室
void goodGay(Student *ptr)
{cout << "访问我的客厅:" << ptr->m_badRoom << endl;cout << "访问我的卧室:" << ptr->m_sittingRoom << endl;
}int main(int argc, char *argv[])
{Student *stu = new Student;goodGay(stu);system("pause");return 0;
}

友元类的定义: 我们除了可以让全局函数访问类中的特定私有数据外,也可以让一个对象实现相同的功能.

#include <iostream>using namespace std;class Teacher
{friend class Student;  // 让Student学生,可以访问我的私有成员private:char * m_school;     // 老师所在的学校char * m_class;      // 老师所教的班级public:Teacher(){this->m_school = "中心小学";this->m_class = "一年级二班";}
};class Student
{
private: Teacher *ptr;              // 设置指向teacher的指针public:Student(){ ptr = new Teacher; } // 构造函数初始化void Display(){// 此时Student中的Display()函数可以访问Teacher类中的私有数据cout << "学生访问到的学校: " << this->ptr->m_school << endl;cout << "学生访问到的班级: " << this->ptr->m_class << endl;}
};int main(int argc, char *argv[])
{Student stu;stu.Display();system("pause");return 0;
}

类实现单例模式: 所谓单例模式就是说一个类只能实例化出一个对象,不论你new创建多少次,始终让其保证只有一个对象,这样就可以防止冲突的情况发生,如下是打印机案例的演示,一个公司可能只有一个打印机,这个打印机必须要单一.

#include <iostream>using namespace std;class Printer
{
private:static Printer * single_Print;static int count;private:Printer(){ };Printer(const Printer & ptr);public:static Printer * getInstance(){count = count + 1;return single_Print;}static void PrintText(char * text){cout << "Printer ready: " << count << text << endl;}
};// 初始化打印机中的静态数据成员
Printer * Printer::single_Print = new Printer;
int Printer::count = 0;int main(int argc, char *argv[])
{// 拿到打印机对象指针,后期通过该指针操作数据Printer * ptr = Printer::getInstance();ptr->getInstance();ptr->getInstance();          // 每次调用都会+1ptr->PrintText(" count");    // 调用打印机system("pause");return 0;
}

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/f7c7b776.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章:

8.3 C++ 定义并使用类

C/C语言是一种通用的编程语言&#xff0c;具有高效、灵活和可移植等特点。C语言主要用于系统编程&#xff0c;如操作系统、编译器、数据库等&#xff1b;C语言是C语言的扩展&#xff0c;增加了面向对象编程的特性&#xff0c;适用于大型软件系统、图形用户界面、嵌入式系统等。…...

Git学习笔记——超详细

Git笔记 安装git&#xff1a; apt install git 创建版本库&#xff1a; git init 添加文件到版本库&#xff1a; git add 文件 提交文件到仓库&#xff1a; git commit -m “注释” 查看仓库当前的状态信息&#xff1a; git status 查看修改内容和之前版本的区别&am…...

Locust负载测试工具实操

本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具&#xff0c;可以通过 Python 代码构造来定义用户行为&#xff0c;避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…...

关闭mysql,关闭redis服务

1. 关闭redis服务&#xff1a; 查询redis安装目录&#xff1a; whereis redis which redis find / -name redis 关闭redis服务&#xff1a; redis-cli -h 127.0.0.1 -p 6379 auth 输入密码 shutdown 关闭redis服务 2. 关闭mysql服务&#xff1a; 查询mysql安装目录&…...

微机原理:汇编语言语句类型与格式

文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB&#xff08;8位&#xff09;2.1.2字定义伪指令DW&#xff08;16位&#xff09;2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT&#xff08;了解&#xff09; 2.2 常用运算符2.2.1…...

iOS Flutter Engine源码调试和修改

iOS Flutter Engine源码调试和修改 1. 前提:2. 步骤&#xff1a;3. 参考资料 1. 前提: 已将成功安装deop_tools工具已经通过gclient命令同步好flutter engine源码 2. 步骤&#xff1a; 进入engine/src目录 创建flutter engine构建文件 真机文件debug模式&#xff1a; ./flu…...

Java日志系统之Log4j

目录 Log4J Log4j的简单使用 日志级别 Log4j的组件 Loggers Appenders Layout Layout格式 设置配置文件加载 配置文件解析 Log4J 是Apache下开源的日志框架 Log4j的简单使用 Testpublic void testLog4J(){Logger logger Logger.getLogger(Log4jTest.class);logger…...

Windows11系统安装WSL教程

WSL&#xff0c;全称Windows Subsystem for Linux&#xff0c;是微软官方提供的可以在Windows上直接运行的Linux环境&#xff0c;包括大多数命令行工具、程序和应用&#xff0c;由系统底层虚拟机平台支持。 开启相关服务 1、控制面板-启用或关闭Windows功能 2、勾选以下两个…...

总结一下vue中v-bind的常见用法

文章目录 &#x1f415;前言&#xff1a;&#x1f3e8;简述一下v-bind命令&#x1f9f8;其它写法1.还是当成字符串&#x1f993;其它写法2.当成对象来使用 &#x1f415;前言&#xff1a; 本篇博客主要总结一下v-bind命令在vue中的常见用法&#xff08;看完即懂&#xff09; …...

全面超越AutoGPT,面壁智能联合清华NLP实验室开源大模型「超级英雄」XAgent

近日&#xff0c;国内领先的人工智能大模型公司面壁智能又放大招&#xff0c;联合清华大学 NLP 实验室共同研发并推出大模型「超级英雄」——XAgent。 通过任务测试&#xff0c;XAgent 在真实复杂任务的处理能力已全面超越 AutoGPT。 现已在 GitHub 正式开源&#xff0c;地址 …...

springBoot--web--http缓存机制测试

springBoot--web--http缓存机制测试 前言1、多端内容适配基于请求头内容协商&#xff08;默认开启&#xff09;基于请求参数内容协商&#xff08;需要开启&#xff09; 2、默认返回json数据3、设置返回xml数据导入jackson-dataformat-xml包在类文件中添加注解 JacksonXmlRootEl…...

免费活动】11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场

活动介绍 过去的几年里&#xff0c;外界的风云变幻为我们的生活增添了一些不一样的色彩。在VUCA世界的浪潮里&#xff0c;每一个人都成为自己生活里的冒险家。面对每一次的变化&#xff0c;勇于探索未知&#xff0c;迎接挑战&#xff0c;努力追逐更好的自己。 七月&#xff0…...

VSCode搭建ESP32 ESP-IDF开发环境-Windows

陈拓 2023/10/09-2023/10/14 1. 安装Windows系统下的ESP32 ESP-IDF开发环境 见《Windows系统安装ESP32 ESP-IDF开发环境》 Windows系统安装ESP32 ESP-IDF开发环境-CSDN博客Windows系统安装ESP32 ESP-IDF开发环境。https://blog.csdn.net/chentuo2000/article/details/1339225…...

Java可重入锁(GPT编写)

Java可重入锁是Java并发编程中常用的一种锁机制&#xff0c;它可以允许同一个线程多次获取同一个锁&#xff0c;从而避免死锁和其他并发问题。在本篇博客中&#xff0c;我们将对Java可重入锁的源码进行分析&#xff0c;以便更好地理解它的实现原理和使用方法。 Java可重入锁的…...

京东数据平台:2023年9月京东净水器行业品牌销售排行榜!

鲸参谋监测的京东平台9月份净水器市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年9月份&#xff0c;京东平台净水器的销量为64万&#xff0c;环比下滑约9%&#xff0c;同比下滑约16%&#xff1b;销售额为5.2亿&#xff0c;环比下滑约12%&#xff0c;…...

skiaSharp linux 生成验码字体显示不出来

一、拷贝windows下的字体如&#xff1a;C:\Windows\Fonts 设置字体的地方&#xff1a; var fontPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts", "TAHOMA.TTF");最终效果&#xff1a;...

WuThreat身份安全云-TVD每日漏洞情报-2023-10-12

漏洞名称:curl SOCKS5 堆溢出漏洞(CVE-2023-38545) 漏洞级别:高危 漏洞编号:CVE-2023-38545,CNVD-2023-75809 相关涉及:cURL libcurl >7.69.0&#xff0c;<8.3.0 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-25382 漏洞名称:Apache H…...

sobel边缘检测算法

Sobel边缘检测算法是一种常用的图像处理技术&#xff0c;用于检测图像中的边缘和轮廓。该算法基于离散卷积操作&#xff0c;通过对图像进行滤波来寻找图像中灰度值的变化。Sobel算子是一种常用的卷积核&#xff0c;用于检测图像中的垂直边缘和水平边缘。以下是Sobel边缘检测算法…...

Kotlin中抽象类与接口

Kotlin 中的抽象类和接口是面向对象编程中的重要概念&#xff0c;它们提供了一种用于定义和组织代码的方式。在下面的代码示例中&#xff0c;我们将介绍 Kotlin 中的抽象类和接口&#xff0c;并给出相应的示例。 抽象类 抽象类是一种不能被实例化的类&#xff0c;它仅用作其他…...

解决osg绘制场景时因Z冲突导致重影或闪烁等不正常情况

目录 1. 问题的提出 2. Z冲突&#xff08;z-fighting&#xff09;简介 2.1. Z冲突&#xff08;z-fighting&#xff09;产生的原因 2.2. 如何消除Z冲突&#xff08;z-fighting&#xff09; 3. 代码实现 1. 问题的提出 今天绘制了一个棋盘格&#xff0c;鼠标在棋盘格上单击…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...