C++的类Class
文章目录
- 一、C的struct和C++的类的区别
- 二、关于OOP
- 三、举例:一个商品类CGoods
- 四、构造函数和析构函数
- 1、定义一个顺序栈
- 2、用构造和析构代替s.init(5);和s.release();
- 3、在不同内存区域构造对象
- 4、深拷贝和浅拷贝
- 5、构造函数和深拷贝的简单应用
- 6、构造函数的初始化列表
- 五、类的各种成员变量和成员方法
- 1、普通成员变量、静态成员变量
- 2、普通成员方法、静态成员方法、常成员方法
- 六、指向类成员(成员变量和成员方法)的指针
一、C的struct和C++的类的区别
以下表格由DeepSeek-R1生成:
| 特性 | C 的 struct | C++ 的 struct | C++ 的 class |
|---|---|---|---|
| 默认访问权限 | 无(仅数据) | public | private |
| 成员函数 | 不支持 | 支持 | 支持 |
| 继承/多态 | 不支持 | 支持 | 支持 |
| 构造/析构函数 | 不支持 | 支持 | 支持 |
| 模板 | 不支持 | 支持 | 支持 |
| 设计用途 | 纯数据聚合 | 简单数据+方法 | 封装复杂对象行为 |
实际开发中,C++ 的 struct 和 class 仅默认权限不同,但习惯上用 struct 表示数据为主的结构,class 表示具有复杂行为的对象。
- 在C中:
各种各样的函数的定义、struct - 在C++中:
实体(属性、行为) -> ADT(abstract data type)
对象 <-(实例化) 类(属性->成员变量行为->成员方法)
二、关于OOP
- Object Oriented Programming:面向对象程序设计
- OOP语言的四大特性:抽象、封装/隐藏、继承、多态
- 类中的访问限定符:(由DeepSeek-R1生成)
| 基类成员访问限定符 | 类内部访问 | 继承方式 | 派生类中基类成员的访问权限 | 外部代码访问 | 友元访问 |
|---|---|---|---|---|---|
public | ✔ | public 继承 | public | ✔ | ✔ |
protected 继承 | protected | ✖ | ✔ | ||
private 继承 | private | ✖ | ✔ | ||
protected | ✔ | public 继承 | protected | ✖ | ✔ |
protected 继承 | protected | ✖ | ✔ | ||
private 继承 | private | ✖ | ✔ | ||
private | ✔ | 任何继承方式 | 不可访问 | ✖ | ✔ |
三、举例:一个商品类CGoods
#include <iostream>
using namespace std;const int NAME_LEN = 20;class CGoods {
public: // 给外部提供公有的成员方法,来访问私有的属性// 商品数据初始化void init(const char *name, double price, int amount);// 打印商品信息void show();// 给成员变量提供getXXX或setXXX的方法(注意:类内部实现的方法,自动处理成inline内联函数)void setName(const char *name) { strcpy_s(_name, sizeof(_name), name); }void setPrice(double price) { _price = price; }void setAmount(int amount) { _amount = amount; }const char *getName() { return _name; }double getPrice() { return _price; }int getAmount() { return _amount; }
private:char _name[NAME_LEN];double _price;int _amount;
};void CGoods::init(const char *name, double price, int amount) {strcpy_s(_name, sizeof(_name), name);_price = price;_amount = amount;
}void CGoods::show() {cout << "name: " << _name << endl;cout << "price: " << _price << endl;cout << "amount: " << _amount << endl;
}int main() {CGoods good1;good1.init("面包", 10.0, 200); good1.show();good1.setPrice(20.5); good1.setAmount(100); good1.show();CGoods good2;good2.init("空调", 10000.0, 50);good2.show();return 0;
}
注意:
- 类可以定义无数个对象,每一个对象都有自己的成员变量,但是它们共享一套成员方法。
- 类内部实现的方法,自动处理成inline内联函数,外部则不会。
- 对象的内存大小,与成员变量有关。VS2022下可以通过cl C++面向对象.cpp /dlreportSingleClassLayoutCGoods查看占用内存大小。
- init(name,price,amount)怎么知道处理哪个对象的信息,把信息初始化给哪一个对象的呢?
类的成员方法一经编译,所有的方法参数,都会加一个this指针,接收调用该方法的对象的地址。
void init(CGoods *this, const char *name, double price, double amount);void CGoods::init(CGoods *this, const char *name, double price, int amount) {strcpy_s(this->_name, sizeof(this->_name), name);this->_price = price;this->_amount = amount;}init(&good1, "面包", 10.0, 200);
四、构造函数和析构函数
1、定义一个顺序栈
#include <iostream>
using namespace std;const int NAME_LEN = 20;class SeqStack {
public: void init(int size = 10) {_pstack = new int[size];_top = -1;_size = size;}void release() {delete[]_pstack;_pstack = nullptr;}void push(int val) {if (full()) {resize();}_pstack[++_top] = val;}void pop() {if (empty()) {return;}--_top;}int top() {return _pstack[_top];}bool empty() { return _top == -1; }bool full() { return _top == _size - 1; }private:int *_pstack;int _top;int _size;void resize() {int* ptmp = new int[_size * 2];for (int i = 0; i < _size; ++i) {ptmp[i] = _pstack[i];} // memcpy(ptmp, _pstack, sizeof(int)*size);或realloc可能产生深拷贝浅拷贝的问题delete[]_pstack;_pstack = ptmp;_size *= 2;}
};int main() {SeqStack s;s.init(5); for (int i = 0; i < 15; ++i) {s.push(rand() % 100);}while (!s.empty()) {cout << s.top() << " ";s.pop();}s.release();return 0;
}
2、用构造和析构代替s.init(5);和s.release();
#include <iostream>
using namespace std;const int NAME_LEN = 20;class SeqStack {
public: SeqStack(int size = 10) { // 构造函数可带参数,可以重载_pstack = new int[size];_top = -1;_size = size;}~SeqStack() { // 不带参数,只能有一个delete[]_pstack;_pstack = nullptr;}void push(int val) {if (full()) {resize();}_pstack[++_top] = val;}void pop() {if (empty()) {return;}--_top;}int top() {return _pstack[_top];}bool empty() { return _top == -1; }bool full() { return _top == _size - 1; }private:int *_pstack;int _top;int _size;void resize() {int* ptmp = new int[_size * 2];for (int i = 0; i < _size; ++i) {ptmp[i] = _pstack[i];} // memcpy(ptmp, _pstack, sizeof(int)*size);或realloc可能产生深拷贝浅拷贝的问题delete[]_pstack;_pstack = ptmp;_size *= 2;}
};int main() {//1.开辟内存 2.调用构造函数SeqStack s(5);//s.init(5); // 对象成员变量的初始化for (int i = 0; i < 15; ++i) {s.push(rand() % 100);}while (!s.empty()) {cout << s.top() << " ";s.pop();}//s.release(); // 释放对象成员变量占用的外部堆内存(外部资源)return 0;
}
3、在不同内存区域构造对象
#include <iostream>
using namespace std;const int NAME_LEN = 20;class SeqStack {
public: SeqStack(int size = 10) {cout << this << " SeqStack" << endl;_pstack = new int[size];_top = -1;_size = size;}~SeqStack() {cout << this << " ~SeqStack" << endl;delete[]_pstack;_pstack = nullptr;}void push(int val) {if (full()) {resize();}_pstack[++_top] = val;}void pop() {if (empty()) {return;}--_top;}int top() {return _pstack[_top];}bool empty() { return _top == -1; }bool full() { return _top == _size - 1; }private:int *_pstack;int _top;int _size;void resize() {int* ptmp = new int[_size * 2];for (int i = 0; i < _size; ++i) {ptmp[i] = _pstack[i];} // memcpy(ptmp, _pstack, sizeof(int)*size);或realloc可能产生深拷贝浅拷贝的问题delete[]_pstack;_pstack = ptmp;_size *= 2;}
};/*
.data
heap
stack
*/
SeqStack s0; //.dataint main() {cout << "heap上对象构造" << endl;SeqStack* ps = new SeqStack(60); // heap malloc内存开辟+SeqStack对象构造ps->push(70);ps->push(80);ps->pop();cout << ps->top() << endl;delete ps; // 先调用ps->~SeqStack()+然后free(ps)cout << "stack上对象构造" << endl;SeqStack s(5); //stackfor (int i = 0; i < 15; ++i) {s.push(rand() % 100);}while (!s.empty()) {cout << s.top() << " ";s.pop();}cout << endl;return 0;
}
打印结果如下:
00007FF7FB3914C0 SeqStack
heap上对象构造
0000026D43E94EF0 SeqStack
70
0000026D43E94EF0 ~SeqStack
stack上对象构造
000000F8EF6FF9D8 SeqStack
61 27 81 45 5 64 62 58 78 24 69 0 34 67 41
000000F8EF6FF9D8 ~SeqStack
00007FF7FB3914C0 ~SeqStack
4、深拷贝和浅拷贝
SeqStack s; // 没有提供任何构造函数的时候,会为你生成默认构造函数SeqStack s1(10);SeqStack s2 = s1; // #1 默认拷贝构造函数 -》做直接内存数据拷贝//Seqstack s3(s1);// #2 同1

上述默认构造函数导致出现浅拷贝的问题,浅拷贝一般包括以下几种问题:
-
多个对象共享同一资源:
如果多个对象的指针成员指向同一块内存,修改其中一个对象会影响其他对象。 -
重复释放资源:
当多个对象的指针指向同一块内存时,析构函数可能会多次释放同一块内存,导致程序崩溃。 -
内存泄漏:
如果资源被浅拷贝后,原始对象的资源没有被正确释放,会导致内存泄漏。
默认拷贝构造函数:浅拷贝
SeqStack(const SeqStack &src) {_pstack = src._pstack;_top = src._top;_size = src._size;}
深拷贝
SeqStack(const SeqStack &src) {_pstack = new int[src._size];for (int i = 0; i <= src._top; ++i) {_pstack[i] = src._pstack[i];}_top = src._top;_size = src._size;}
如果对两个已经存在的对象进行赋值操作,也会出现浅拷贝问题
int main() {cout << "开始构造s" << endl;SeqStack s; // 没有提供任何构造函数的时候,会为你生成默认构造函数cout << "开始构造s1" << endl;SeqStack s1(10);cout << "开始构造s2" << endl;SeqStack s2 = s1; // #1 默认拷贝构造函数 -》做直接内存数据拷贝//Seqstack s3(s1);// #2 同1s2 = s1;return 0;
}
s2 = s1; // 默认的赋值函数 =》做直接的内存拷贝
修改如下:
// s2.operator=(s1)
// void operator=(const SeqStack &src)
#include <iostream>
using namespace std;const int NAME_LEN = 20;class SeqStack {
public: SeqStack(int size = 10) {cout << this << " SeqStack" << endl;_pstack = new int[size];_top = -1;_size = size;}// 自定义拷贝构造函数SeqStack(const SeqStack& src) { cout << this << " const SeqStack& src" << endl;_pstack = new int[src._size];for (int i = 0; i <= src._top; ++i) {_pstack[i] = src._pstack[i];}_top = src._top;_size = src._size;}// 赋值重载函数void operator=(const SeqStack& src) {cout << this << " operator=" << endl;// 防止自赋值if (this == &src) {return;}// 需要先释放当前对象占用的外部资源delete[]_pstack;_pstack = new int[src._size];for (int i = 0; i <= src._top; ++i) {_pstack[i] = src._pstack[i];}_top = src._top;_size = src._size;}~SeqStack() {cout << this << " ~SeqStack" << endl;delete[]_pstack;_pstack = nullptr;}void push(int val) {if (full()) {resize();}_pstack[++_top] = val;}void pop() {if (empty()) {return;}--_top;}int top() {return _pstack[_top];}bool empty() { return _top == -1; }bool full() { return _top == _size - 1; }private:int *_pstack;int _top;int _size;void resize() {int* ptmp = new int[_size * 2];for (int i = 0; i < _size; ++i) {ptmp[i] = _pstack[i];} // memcpy(ptmp, _pstack, sizeof(int)*size);或realloc可能产生深拷贝浅拷贝的问题delete[]_pstack;_pstack = ptmp;_size *= 2;}
};int main() {cout << "开始构造s" << endl;SeqStack s; // 没有提供任何构造函数的时候,会为你生成默认构造函数cout << "开始构造s1" << endl;SeqStack s1(10);cout << "开始构造s2" << endl;SeqStack s2 = s1; // #1 默认拷贝构造函数 -》做直接内存数据拷贝//Seqstack s3(s1);// #2 同1s2 = s1;return 0;
}
打印结果:
开始构造s
0000003B8E14F6C8 SeqStack
开始构造s1
0000003B8E14F6F8 SeqStack
开始构造s2
0000003B8E14F728 const SeqStack& src
0000003B8E14F728 operator=
0000003B8E14F728 ~SeqStack
0000003B8E14F6F8 ~SeqStack
0000003B8E14F6C8 ~SeqStack
5、构造函数和深拷贝的简单应用
- 字符串String
#include <iostream>
using namespace std;class String {
public: String(const char* str = nullptr) { // 普通构造函数if (str != nullptr) {m_data = new char[strlen(str) + 1];strcpy_s(m_data, strlen(str) + 1, str);}else {m_data = new char[1];*m_data = '\0';}}String(const String& other) { // 拷贝构造函数m_data = new char[strlen(other.m_data) + 1];strcpy_s(m_data, strlen(other.m_data) + 1, other.m_data);}~String() {delete[]m_data;m_data = nullptr;}String& operator=(const String& other) { // 返回值不是void,而是当前类型的引用,是为了连续赋值if (this == &other) {return *this;}delete[]m_data;m_data = new char[strlen(other.m_data) + 1];strcpy_s(m_data, strlen(other.m_data) + 1, other.m_data);return *this;}private:char* m_data;
};int main() {// 调用带const char*参数的构造函数String str1;String str2("hello");String str3 = "world";// 调用拷贝构造函数String str4 = str3;String str5(str4);// 调用赋值重载函数str1 = str2;str3 = str1 = str2; // 连续赋值return 0;
}
- 循环队列Queue
#include <iostream>
using namespace std;class Queue {
public: Queue(int size = 20) {_pQue = new int[size];_front = _rear = 0;_size = size;}Queue(const Queue &src) {_front = src._front;_rear = src._rear;_size = src._size;_pQue = new int[_size];for (int i = _front; i != _rear; i = (i + 1) % _size) {_pQue[i] = src._pQue[i];}}Queue& operator=(const Queue& src) {if (this == &src) {return *this;}delete[]_pQue;_front = src._front;_rear = src._rear;_size = src._size;_pQue = new int[_size];for (int i = _front; i != _rear; i = (i + 1) % _size) {_pQue[i] = src._pQue[i];}return *this;}~Queue() {delete[]_pQue;_pQue = nullptr;}void push(int val) {// 入队操作if (full()) {resize();}_pQue[_rear] = val;_rear = (_rear + 1) % _size;}void pop() { // 出队操作if (empty()) {return;}_front = (_front + 1) % _size;}int front() {return _pQue[_front];}bool full() {return (_rear + 1) % _size == _front;}bool empty() {return _front == _rear;}private:int* _pQue; // 申请队列的数组空间int _front; // 指示队头的位置int _rear; // 指示队尾的位置int _size; // 队列扩容的总大小void resize() {int* ptmp = new int[2 * _size];int index = 0;for (int i = _front; i != _rear; i = (i + 1) % _size) {ptmp[index++] = _pQue[i];}delete[]_pQue;_pQue = ptmp;_front = 0;_rear = index;_size *= 2;}
};int main() {Queue q;for (int i = 0; i < 20; ++i) {q.push(rand() % 100);}while (!q.empty()) {cout << q.front() << " ";q.pop();}cout << endl;Queue q1 = q;q1 = q;return 0;
}
6、构造函数的初始化列表
#include <iostream>
using namespace std;class CDate {
public:CDate(int y, int m, int d) { //自定义的构造函数_year = y;_month = m;_day = d;}void show() {cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day; };/*
构造函数的初始化列表: 可以指定当前对象成员变量的初始化方式
CDate信息 CGoods商品信息的一部分 a part of ... 组合的关系
*/
class CGoods {
public: // "CDate"没有合适的构造函数可用,因此在这里使用初始化列表CGoods(const char *n, int a, double p, int y, int m, int d): _date(y, m, d), _amount(a) // 相当于int _amount = a;直接进行初始化,// 避免了先定义(int _amount; _amount = a;)需要调用默认构造函数,// 而CDate因为定义了自定义的构造函数,不会调用默认构造函数, _price(p) // #1 构造函数的初始化列表{// #2 当前类类型构造函数体strcpy_s(_name, 20, n);}void show() {cout << "name: " << _name << endl;cout << "amount: " << _amount << endl;cout << "price: " << _price << endl;_date.show();}private:char _name[20];int _amount;double _price;CDate _date; // 成员对象 1.分配内存 2.调用构造函数
};int main() {CGoods good("商品", 100, 35.0, 2025, 1, 27);good.show();return 0;
}
注意:成员变量的初始化和它们定义的顺序有关,和构造函数初始化列表中出现的先后顺序无关!
#include <iostream>
using namespace std;class Test {
public: Test(int m = 10):mb(m), ma(mb) {}void show() {cout << "ma: " << ma << "mb: " << mb << endl;}private:int ma;int mb;
};int main() {Test t; t.show(); // ma: -858993460 mb: 10return 0;
}
Windows下会将未初始化的内存填充为特定的值0xCCCCCCCC(十进制为-858993460),先初始化ma,而此时mb未初始化,其值-858993460,因此ma: -858993460,而mb: 10。
五、类的各种成员变量和成员方法
1、普通成员变量、静态成员变量
2、普通成员方法、静态成员方法、常成员方法
- 普通的成员方法 =>编译器会添加一个this形参变量
1.属于类的作用域
2.调用该方法时,需要依赖一个对象!常对象是无法调用的 实参:const CGoods* -》CGoods *this
3.可以任意访问对象的私有成员 protected继承 public private - static静态成员方法 =>不会生成this形参
1.属于类的作用域
2.用类名作用域来调用方法
3.可以任意访问对象的私有成员,仅限于不依赖对象的成员(只能调用其它的static静态成员) - const常成员方法 const CGoods *this
1.属于类的作用域
2.调用依赖一个对象,普通对象或者常对象都可以
3.可以任意访问对象的私有成员,但是只能读,而不能写(只要是只读操作的成员方法,一律实现成const常成员方法)
#include <iostream>
using namespace std;const int NAME_LEN = 20;class CGoods {
public:CGoods(const char* name, double price, int amount);void show();void show() const;static void showCount();private:char _name[NAME_LEN];double _price;int _amount;static int _count; // 声明 用来记录商品对象的总数量;不属于对象,而属于类级别的
};// static成员变量一定要在类外进行定义并且初始化
int CGoods::_count = 0; CGoods::CGoods(const char* name, double price, int amount) {strcpy_s(_name, sizeof(_name), name);_price = price;_amount = amount;_count++; // 记录所有产生的新对象的数量
}// 普通成员方法 CGoods *this
void CGoods::show() {cout << "name: " << _name << endl;cout << "price: " << _price << endl;cout << "amount: " << _amount << endl;
}// 常成员方法 const CGoods *this
void CGoods::show() const {cout << "name: " << _name << endl;cout << "price: " << _price << endl;cout << "amount: " << _amount << endl;
}// 静态成员方法 没有this指针
void CGoods::showCount() {cout << "所有商品数量: " << _count << endl;
}int main() {CGoods good1("面包", 10.0, 200);good1.show();CGoods good2("空调", 100.0, 50);good2.show();CGoods::showCount();const CGoods good3("非卖品", 10000.0, 1);good3.show(); //CGoods::show(&good3) const CGoods* -> CGoods*不可以return 0;
}
六、指向类成员(成员变量和成员方法)的指针
指向普通成员变量的指针依赖于对象的调用,指向静态成员变量的指针不依赖。
指向普通成员方法的函数指针同样依赖于对象的调用,指向静态成员方法的指针不依赖。
#include <iostream>
using namespace std;class Test {
public:void func() { cout << "call Test::func" << endl; }static void static_func() { cout << "Test::static func" << endl; }int ma;static int mb;
};int Test::mb;int main() {Test t1; Test *t2 = new Test();// 指向成员变量的指针// int a=10; int *p=&a; *p=30;int Test::*p = &Test::ma;t1.*p = 20;cout << t1.*p<< endl;t2->*p = 30; cout << t2->*p << endl; // 指向静态成员变量的指针int *p1 = &Test::mb;*p1 = 40;cout << *p1 << endl;// 指向成员方法的指针void (Test::*pfunc)() = &Test::func; (t1.*pfunc)();(t2->*pfunc)();// 定义函数指针指向类的静态成员方法void(*pfunc1)() = &Test::static_func;(*pfunc1)();delete t2;return 0;
}
打印结果如下:
20
30
40
call Test::func
call Test::func
Test::static func
相关文章:
C++的类Class
文章目录 一、C的struct和C的类的区别二、关于OOP三、举例:一个商品类CGoods四、构造函数和析构函数1、定义一个顺序栈2、用构造和析构代替s.init(5);和s.release();3、在不同内存区域构造对象4、深拷贝和浅拷贝5、构造函数和深拷贝的简单应用6、构造函数的初始化列…...
C++中的内存管理
学完了类与对象,这节我们来了解一下内存里的那些事 文章目录 一、C/C中的内存分布 1. 常量区(代码段) (Text Segment) 2. 静态区(数据段) (Data Segment) 3. 堆区 (Heap) 4. 栈区 (Stack) 5. 内存映射区域 (Memory-map…...
MySQL为什么默认引擎是InnoDB ?
大家好,我是锋哥。今天分享关于【MySQL为什么默认引擎是InnoDB ?】面试题。希望对大家有帮助; MySQL为什么默认引擎是InnoDB ? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 默认引擎是 InnoDB,主要…...
ComfyUI安装调用DeepSeek——DeepSeek多模态之图形模型安装问题解决(ComfyUI-Janus-Pro)
ComfyUI 的 Janus-Pro 节点,一个统一的多模态理解和生成框架。 试用: https://huggingface.co/spaces/deepseek-ai/Janus-1.3B https://huggingface.co/spaces/deepseek-ai/Janus-Pro-7B https://huggingface.co/spaces/deepseek-ai/JanusFlow-1.3B 安装…...
电脑要使用cuda需要进行什么配置
在电脑上使用CUDA(NVIDIA的并行计算平台和API),需要进行以下配置和准备: 1. 检查NVIDIA显卡支持 确保你的电脑拥有支持CUDA的NVIDIA显卡。 可以在NVIDIA官方CUDA支持显卡列表中查看显卡型号是否支持CUDA。 2. 安装NVIDIA显卡驱动…...
利用Muduo库实现简单且健壮的Echo服务器
一、muduo网络库主要提供了两个类: TcpServer:用于编写服务器程序 TcpClient:用于编写客户端程序 二、三个重要的链接库: libmuduo_net、libmuduo_base、libpthread 三、muduo库底层就是epoll线程池,其好处是…...
Scratch 《像素战场》系列综合游戏:像素战场游戏Ⅰ~Ⅲ 介绍
资源下载 Scratch《像素战场》系列综合游戏合集:像素战场游戏Ⅰ~Ⅲ压缩包 https://download.csdn.net/download/leyang0910/90332765 游戏操作介绍 Scratch 《像素战场Ⅰ》操作规则: 这是一款与朋友一起玩的 1v1 游戏。先赢得6轮胜利! WA…...
Android学习制作app(ESP8266-01S连接-简单制作)
一、理论 部分理论见arduino学习-CSDN博客和Android Studio安装配置_android studio gradle 配置-CSDN博客 以下直接上代码和效果视频,esp01S的收发硬件代码目前没有分享,但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…...
三甲医院大型生信服务器多配置方案剖析与应用(2024版)
一、引言 1.1 研究背景与意义 在当今数智化时代,生物信息学作为一门融合生物学、计算机科学和信息技术的交叉学科,在三甲医院的科研和临床应用中占据着举足轻重的地位。随着高通量测序技术、医学影像技术等的飞速发展,生物医学数据呈爆发式…...
【Unity3D】实现横版2D游戏——单向平台(简易版)
目录 问题 项目Demo直接使用免费资源:Hero Knight - Pixel Art (Asset Store搜索) 打开Demo场景,进行如下修改,注意Tag是自定义标签SingleDirCollider using System.Collections; using System.Collections.Generic;…...
大白话讲清楚embedding原理
Embedding(嵌入)是一种将高维数据(如单词、句子、图像等)映射到低维连续向量的技术,其核心目的是通过向量表示捕捉数据之间的语义或特征关系。以下从原理、方法和应用三个方面详细解释Embedding的工作原理。 一、Embe…...
电脑优化大师-解决电脑卡顿问题
我们常常会遇到电脑运行缓慢、网速卡顿的情况,但又不知道是哪个程序在占用过多资源。这时候,一款能够实时监控网络和系统状态的工具就显得尤为重要了。今天,就来给大家介绍一款小巧实用的监控工具「TrafficMonitor」。 「TrafficMonitor 」是…...
el-table组件样式如何二次修改?
文章目录 前言一、去除全选框按钮样式二、表头颜色的修改 前言 ElementUI中的组件el-table表格组件提供了丰富的样式,有一个全选框的el-table组件,提供了全选框和多选。 一、去除全选框按钮样式 原本默认是有全选框的。假如有一些开发者,因…...
java练习(1)
两数之和(题目来自力扣) 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相…...
UbuntuWindows双系统安装
做系统盘: Ubuntu20.04双系统安装详解(内容详细,一文通关!)_ubuntu 20.04-CSDN博客 ubuntu系统调整大小: 调整指南: 虚拟机中的Ubuntu扩容及重新分区方法_ubuntu重新分配磁盘空间-CSDN博客 …...
DeepSeek大模型技术深度解析:揭开Transformer架构的神秘面纱
摘要 DeepSeek大模型由北京深度求索人工智能基础技术研究有限公司开发,基于Transformer架构,具备卓越的自然语言理解和生成能力。该模型能够高效处理智能对话、文本生成和语义理解等复杂任务,标志着人工智能在自然语言处理领域的重大进展。 关…...
MusicFree-开源的第三方音乐在线播放和下载工具, 支持歌单导入[对标落雪音乐]
MusicFree 链接:https://pan.xunlei.com/s/VOI0RrVLTTWE9kkpt0U7ofGBA1?pwd4ei6#...
Versal - 基础4(VD100+Versal IBERT)
1. 简介 在之前的一篇博文中,我分享了在 Zynq Ultrascale MPSoC 中使用 IBERT 的方法。 《Vivado - 集成眼图分析仪 Serial I/O IBERT 误码率_vivado ibert-CSDN博客》 本文进一步探讨 Versal 中使用 IBERT 的方法。 2. 硬件平台 芯片:XCVE2302-SF…...
vue2和vue3路由封装及区别
Vue 2 和 Vue 3 在路由封装方面有一些区别,主要体现在 Vue Router 版本的升级(Vue Router 3 -> Vue Router 4)上。下面我们来对比一下 Vue 2 和 Vue 3 在路由封装上的主要区别,并提供相应的代码示例。 1. Vue 2 路由封装&#…...
Windows 系统下使用 Ollama 离线部署 DeepSeek - R1 模型指南
引言 随着人工智能技术的飞速发展,各类大语言模型层出不穷。DeepSeek - R1 凭借其出色的语言理解和生成能力,受到了广泛关注。而 Ollama 作为一款便捷的模型管理和部署工具,能够帮助我们轻松地在本地环境中部署和使用模型。本文将详细介绍如…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
