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

C++面向对象编程学习

C++面向对象编程学习

  • 前言
  • 一、C++面向对象编程
  • 二、知识点学习
    • 1. 定义一个类
      • 1.1 使用struct定义
      • 1.2 使用class定义
      • 1.3 struct和class的区别
    • 2. 类的定义方式
      • 2.1 单文件定义(Inline Definition)
      • 2.2 分离定义(Separate Definition)
      • 2.3 头文件守卫
    • 3. 访问修饰符
    • 4. 构造函数与析构函数
      • 4.1 构造函数(Constructor)
      • 4.2 析构函数(Destructor)
    • 5. this指针
    • 6. 虚函数
    • 7. 继承
    • 8. 其余内容
  • 总结


前言

注意:本文只适合有C++基础的朋友食用!另本文章目的在于记录学习C++面向编程学习的过程,会引用到其他人的文章。
推荐文章:【C++核心】一文理解C++面向对象(超级详细!)(作者:数据知道)


一、C++面向对象编程

先由一段C++面向对象编程的典例的代码引入学习:

#include <iostream>
#include <string>// 基类:Animal
class Animal {
public: // 访问权限// 构造函数Animal(std::string name) : name_(name) {}// 虚析构函数virtual ~Animal() {}// 虚函数,用于发声virtual void makeSound() const = 0; // 纯虚函数// 打印动物的名字void printName() const {std::cout << "My name is " << name_ << std::endl;}protected:std::string name_; // 动物的名字
};// 派生类(子类):Dog
class Dog : public Animal {
public:// 构造函数Dog(std::string name) : Animal(name) {}// 实现基类的纯虚函数void makeSound() const override {std::cout << name_ << " says: Bark!" << std::endl;}
};// 派生类:Cat
class Cat : public Animal {
public:// 构造函数Cat(std::string name) : Animal(name) {}// 实现基类的纯虚函数void makeSound() const override {std::cout << name_ << " says: Meow!" << std::endl;}
};// 函数模板,用于处理任何类型的Animal
template <typename AnimalType>
void makeAnimalSound(const AnimalType& animal) {animal.makeSound();
}int main() {Dog dog("Rex");Cat cat("Whiskers");dog.printName();dog.makeSound();cat.printName();cat.makeSound();// 使用模板函数makeAnimalSound(dog);makeAnimalSound(cat);return 0;
}

二、知识点学习

1. 定义一个类

在C++中,structclass关键字都可以用来定义一个类,但它们在默认的访问权限上有所不同。以下是使用structclass定义同一个类的例子:

1.1 使用struct定义

struct MyStruct {int publicData; // 默认为publicprivate:int privateData; // 私有成员public:MyStruct(int value) : privateData(value) {}int getPrivateData() const {return privateData;}void setPrivateData(int value) {privateData = value;}private:void privateMethod() {// 私有方法}
};

1.2 使用class定义

class MyClass {int publicData; // 默认为privateprivate:int privateData; // 私有成员public:MyClass(int value) : privateData(value) {}int getPrivateData() const {return privateData;}void setPrivateData(int value) {privateData = value;}private:void privateMethod() {// 私有方法}
};

1.3 struct和class的区别

  • struct中,如果没有指定访问修饰符,成员默认是public的。
  • class中,如果没有指定访问修饰符,成员默认是private的。

从C++11起,你可以使用struct来定义一个简单的数据结构(没有或很少的行为),而class通常用于定义具有封装、继承和多态特性的对象(强调一个类型是具有封装、继承和多态的对象)。然而,这只是一个编程习惯上的区分,技术上你可以使用任何一个关键字来定义任何类型的类。

2. 类的定义方式

在C++中,类的定义通常有两种主要方式:一种是在单个文件中定义类的全部内容,另一种是将类的声明(通常称为头文件)和定义(通常称为源文件)分开。

  • 单文件定义:通常用于小型项目或简单的类,其中类的实现非常简短,或者为了减少编译依赖。
  • 分离定义:通常用于大型项目或复杂的类,其中需要隐藏实现细节,提高代码的可维护性和可读性。

2.1 单文件定义(Inline Definition)

在这种方式中,类的定义被直接放在头文件中,通常是在.h.hpp扩展名的文件中。这种方式被称为内联定义或头文件中的定义。

示例:

// MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_Hclass MyClass {
public:void function() {// 实现细节}
private:int data;
};#endif // MYCLASS_H

在这种方式中,每次包含头文件时,类的定义都会被包含到使用它的每个源文件中。这可能会导致代码重复,但可以减少编译依赖和提高编译速度。

2.2 分离定义(Separate Definition)

就是类的声明放在头文件(.h.hpp),类的(定义)实现放在源文件(.cpp)。

头文件( MyClass.h ):

// MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_Hclass MyClass {
public:void function();
private:int data;
};#endif // MYCLASS_H

源文件( MyClass.cpp ):

// MyClass.cpp
#include "MyClass.h"void MyClass::function() {// 实现细节data = 42; // 访问私有成员
}

在这种方式中,类的实现被隐藏在源文件中,只有声明被包含在其他文件中。这样做的好处是增加了模块化,减少了重复代码,并且使得单个类的定义更容易维护。

2.3 头文件守卫

这段代码是C++预处理器指令,用于防止头文件被多次包含,这是一种常见的头文件保护技术。这种技术被称为“包含保护”或“头文件守卫”。下面是每个指令的解释:

  1. #ifndef MYCLASS_H - 这个指令检查一个宏(在这个例子中是MYCLASS_H)是否还未定义。#ifndef是“if not defined”的缩写。如果MYCLASS_H没有定义,那么预处理器会继续处理下面的代码。

  2. #define MYCLASS_H - 这个指令定义了MYCLASS_H宏。这样,如果这个头文件被包含多次,预处理器会记住MYCLASS_H已经被定义了,并且跳过第二次及后续的包含。

  3. #endif // MYCLASS_H - 这个指令标记了预处理条件块的结束。#endif指示预处理器停止处理条件块。注释// MYCLASS_H是为了提供额外的信息,说明这个#endif与哪个#ifndef配对。这是一个编程习惯,有助于在阅读代码时快速识别匹配的指令。

包含保护的目的是防止头文件的内容被编译多次,这可能发生在多个源文件都包含了同一个头文件的情况下。如果没有包含保护,每次头文件被包含时,它的代码都会被重新编译,这不仅会导致编译错误(如重复定义),还可能降低编译效率。

例如,如果你有以下头文件和源文件结构:

// MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_Hclass MyClass {// 类的定义
};#endif // MYCLASS_H// main.cpp
#include "MyClass.h"
#include "MyClass.h" // 第二次包含相同的头文件int main() {MyClass myObject;// 使用myObject
}

在没有包含保护的情况下,MyClass的定义会被包含两次,导致编译器报错,因为它尝试定义同一个类两次。有了包含保护,预处理器会识别出第二次包含是重复的,并忽略它,从而避免编译错误。

请注意,#endif指令前的注释// MYCLASS_H是可选的,但它有助于在阅读代码时快速定位匹配的#ifndef指令。

3. 访问修饰符

(1)public--------公共的,类外部可以访问;
(2)protected—保护的,类外部不可以访问;
(3)private-------私有的,类外部不能访问;

解析:

  1. public(公共的)

    • 类外部可以访问:类的公共成员在定义类的外部是可见的,可以直接通过类的实例来访问。
    • 示例
      class MyClass {
      public:int publicData; // 公共成员,可以直接访问void publicMethod() {} // 公共成员函数,可以直接调用
      };MyClass obj;
      obj.publicData = 10; // 直接访问公共成员变量
      obj.publicMethod(); // 直接调用公共成员函数
      
  2. protected(保护的)

    • 类外部不可以访问:类的受保护成员在定义类的外部是不可见的,不能直接通过类的实例来访问。
    • 但可以在派生类中访问:如果一个类派生自具有受保护成员的基类,那么这些受保护的成员在派生类中是可见的。
    • 示例
      class Base {
      protected:int protectedData; // 受保护成员,不能直接访问
      };class Derived : public Base {
      public:void accessBaseMembers() {protectedData = 20; // 在派生类中可以访问基类的受保护成员}
      };Derived obj;
      // obj.protectedData = 20; // 错误:在类外部不能直接访问受保护成员
      obj.accessBaseMembers(); // 正确:通过派生类的公共接口访问基类的受保护成员
      
  3. private(私有的)

    • 类外部不能访问:类的私有成员在定义类的外部是不可见的,不能直接通过类的实例来访问。
    • 类内部可以访问:私有成员只能在定义它们的类内部被访问,包括类的成员函数和友元类或友元函数。
    • 示例
      class MyClass {
      private:int privateData; // 私有成员,不能直接访问void privateMethod() {} // 私有成员函数,不能直接调用public:void publicMethod() {privateData = 30; // 在类内部可以访问私有成员privateMethod(); // 在类内部可以调用私有成员函数}
      };MyClass obj;
      // obj.privateData = 30; // 错误:在类外部不能直接访问私有成员
      // obj.privateMethod(); // 错误:在类外部不能直接调用私有成员函数
      obj.publicMethod(); // 正确:通过公共成员函数间接访问私有成员
      

4. 构造函数与析构函数

在C++中,构造函数和析构函数是特殊的成员函数,它们分别用于初始化对象和清理对象使用资源。
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。语法格式如下:
构造函数语法:类名(){}

析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。语法格式如下:
析构函数语法: ~类名(){}

4.1 构造函数(Constructor)

构造函数是一种特殊的成员函数,用于创建类的对象时初始化对象。它具有与类相同的名称,且没有返回类型,也不能被声明为constvolatilestatic。构造函数可以有参数,也可以没有参数(无参数构造函数),可以有多个构造函数(构造函数重载),以适应不同的初始化需求。

特点

  • 没有返回值,也不抛出异常(除了析构函数外)。
  • 可以有0个或多个参数。
  • 可以有默认参数。
  • 可以被重载以提供不同的初始化方式。

示例

class MyClass {
public:// 无参数的构造函数MyClass() {// 初始化代码}// 带参数的构造函数MyClass(int value) {// 使用参数value进行初始化}// 带多个参数的构造函数MyClass(int value, const std::string& name) {// 使用参数value和name进行初始化}
};

4.2 析构函数(Destructor)

析构函数是一种特殊的成员函数,用于对象生命周期结束时执行清理工作。它用于释放对象在生命周期中分配的资源,如动态分配的内存、文件句柄、网络连接等。析构函数的名称是在类名前加上波浪号(~),且析构函数不能有参数,不能有返回值,也不能被重载。

特点

  • 没有返回值。
  • 不能带有参数。
  • 不能被重载。
  • 一个类只能有一个析构函数。

示例

class MyClass {
public:// 构造函数MyClass() {// 分配资源,如动态内存}// 析构函数~MyClass() {// 释放资源,如动态内存}
};

在上述示例中,当使用new创建MyClass对象时,会调用构造函数进行初始化。当对象不再需要时,比如超出作用域或者使用delete时,会调用析构函数进行清理。

5. this指针

在C++中,this 指针是一个特殊的指针,它在每个非静态成员函数内部可用。this 指针指向调用成员函数的对象本身,它允许成员函数访问对象的数据成员和成员函数。
作用

  1. 访问对象的成员:成员函数经常需要访问调用它的那个对象的成员变量和其他成员函数。this 指针使得成员函数能够区分不同的对象,即使它们拥有相同的成员名称。

  2. 链式调用this 指针可以用来返回对象本身,从而实现链式调用。

  3. 区分成员变量和局部变量:当成员函数中的局部变量与类的成员变量同名时,this 指针可以用来区分它们。

示例

class MyClass {int value;public:MyClass(int val) : value(val) {}int getValue() const {return value; // 使用this指针访问成员变量}MyClass& set(int val) { // 成员函数返回对象的引用this->value = val;return *this; // 使用this指针返回对象本身}void printValue() const {int localValue = 10; // 局部变量int* memVarPtr = &this->value; // 使用this指针区分成员变量和局部变量int* localVarPtr = &localValue;// 输出指针地址以区分成员变量和局部变量std::cout << "Member variable value: " << *memVarPtr << std::endl;std::cout << "Local variable value: " << *localVarPtr << std::endl;}
};int main() {MyClass obj(100);obj.printValue(); // 输出对象的成员变量和局部变量的值obj.set(200).set(300).set(400); // 链式调用std::cout << "Final value: " << obj.getValue() << std::endl; // 输出最终值return 0;
}

注意事项

  • this 指针在静态成员函数中不可用,因为静态成员函数不依赖于具体的对象实例。
  • this 指针在普通成员函数中是隐式定义的,不需要声明。
  • this 指针通常不需要手动管理,但了解其存在和作用对于编写更清晰和更有效的代码是有帮助的。
  • 在异常情况下,如果成员函数被非法调用(例如,在一个未初始化的对象上),this 指针可能不是一个有效的指针,因此在处理异常和错误时需要小心。

6. 虚函数

语法格式:

virtual ReturnType FunctionName(Parameters) {// 函数实现
}

这里的virtual关键字告诉编译器这个函数是虚函数,可以被子类重写。

当通过基类指针或引用调用虚函数时,如果对象实际是派生类的实例,那么将调用派生类中的版本,这就是多态。如果对象是基类实例,则调用基类中的版本。

例如:

class Base {
public:virtual void show() {cout << "Base class show()" << endl;}
};class Derived : public Base {
public:void show() override { // C++11中引入了override关键字来明确指出函数重写了基类中的虚函数cout << "Derived class show()" << endl;}
};int main() {Base* b;Derived d;b = &d; // 基类指针指向派生类对象b->show(); // 输出Derived class show(),展示了多态性return 0;
}

在这个例子中,尽管b是基类Base的指针,但由于它指向的是派生类Derived的对象,所以调用的实际上是Derived类中的show方法。

7. 继承

语法:class A : public B;
MyFrame::MyFrame() 表示MyFrame()是MyFrame的构造函数。
继承的主要优点包括:

  1. 代码重用:可以减少代码冗余,提高开发效率。
  2. 扩展性:可以基于现有的类进行扩展,增加新的功能。
  3. 维护性:修改基类会影响到所有派生类,简化了维护工作。

在C++中,继承是通过在类定义时使用:和继承类型关键字(如public, protected, private)来实现的。例如:

class Base {
public:void show() {cout << "Base class show()" << endl;}
};class Derived : public Base { // 使用public继承
public:void display() {cout << "Derived class display()" << endl;}
};int main() {Derived d;d.show(); // 继承自Base类的show方法d.display(); // Derived类特有的display方法return 0;
}

在这个例子中,Derived类通过public关键字继承了Base类。这意味着Derived类的对象可以访问Base类中所有公有的成员。

继承类型关键字决定了基类成员在派生类中的访问级别:

  • public继承:基类中的公有成员和保护成员在派生类中仍然是公有的和保护的。
  • protected继承:基类中的公有成员和保护成员在派生类中都变成保护的。
  • private继承:基类中的公有成员和保护成员在派生类中都变成私有的。

8. 其余内容

推荐文章:【C++核心】一文理解C++面向对象(超级详细!)(作者:数据知道)


总结

本来学的C++没有学到面向对象编程这块,应为主要用来刷算法题,但由于最近一个项目学习需要到此方面知识,故来学习一下。

相关文章:

C++面向对象编程学习

C面向对象编程学习 前言一、C面向对象编程二、知识点学习1. 定义一个类1.1 使用struct定义1.2 使用class定义1.3 struct和class的区别 2. 类的定义方式2.1 单文件定义&#xff08;Inline Definition&#xff09;2.2 分离定义&#xff08;Separate Definition&#xff09;2.3 头…...

云轴科技ZStack亮相迪拜GITEX大会,与阿里云再次携手深化海外合作

10月14至18日&#xff0c;全球顶尖科技盛会GITEX GLOBAL 2024在迪拜拉开帷幕&#xff0c;云轴科技ZStack携全系云计算解决方案与全新AIOS智塔平台参展&#xff0c;向全球观众展示智算时代下的新一代智算化算力平台。 GITEX GLOBAL 2024是当今世界上最具前瞻性兼包容性的大型科技…...

SQL Server 当前日期及其未来三天的日期

当前日期及其未来三天的日期&#xff0c;并分别以 YYYY-MM-DD 和 yyyyMMdd 的格式展示 1、当前日期及其未来三天的日期&#xff0c;以 YYYY-MM-DD的格式展示 WITH CurrentDate AS (SELECT GETDATE() AS 当前日期 ) -- 使用 CONVERT 函数 SELECTCONVERT(VARCHAR(10), 当前日期,…...

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC&#xff08;Quick UDP Internet Connections&#xff09;和 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是两种不同的网络传输协议&#xff0c;它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP&#xff1a;QUIC 建立在 UDP 之上&#xff…...

双十一送你一份购物攻略,绿联NAS DXP2800评测

一年一度双十一&#xff0c;今年双十一来得特别早&#xff0c;所以最近已经看到不少人在讨论双十一买了啥&#xff0c;NAS的讨论度也挺高的。正好&#xff0c;是我比较懂的领域。作为一位资深的数码爱好者&#xff0c;同时也是绿联DH2600DXP2800双持用户&#xff0c;可以说我是…...

基于vue框架的的高校设备信息管理系统的设计与实现tx6d7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;设备管理员,设备维护员,设备类别,设备,设备入库,设备分发,设备调拨,定期维护,维护任务,设备运行记录 开题报告内容 基于Vue框架的高校设备信息管理系统的设计与实现开题报告 一、项目背景及意义 随着高校教育事业的蓬勃发展&#xff…...

springboot3.x使用@NacosValue无法获取配置信息问题解决

一、问题描述 springboot从2.x升级到3.x后&#xff0c;nacos的依赖包需要改成Spring Cloud的依赖包才能继续使用。升级好以后&#xff0c;首先&#xff0c;确定我的项目是能够连上nacos并且加载到配置信息的&#xff0c;因为数据库等信息都是从nacos加载过来&#xff0c;能够正…...

sql获取时间差

MySQL SELECT TIMESTAMPDIFF(HOUR, 2023-10-01 12:00:00, 2023-10-02 15:30:00) AS hours_difference; PostgreSQL //EXTRACT(EPOCH FROM (2023-10-02 15:30:00::timestamp - 2023-10-01 12:00:00::timestamp)) // 获取的是两个时间相差的秒数&#xff0c;在此基础上除3600获…...

【深入理解Python中的闭包】如何有效使用嵌套函数和状态捕获!

深入理解Python中的闭包&#xff1a;如何有效使用嵌套函数和状态捕获 Python 作为一种动态的编程语言&#xff0c;允许我们用多种方式来设计和构建功能&#xff0c;其中之一就是 闭包&#xff08;Closure&#xff09;。闭包是一种强大的特性&#xff0c;可以帮助我们捕获和保持…...

npm配置阿里镜像库教程

为了配置npm使用阿里镜像库&#xff0c;可以按照以下步骤进行操作。这些步骤将帮助你加快包的下载速度&#xff0c;特别是在中国地区&#xff0c;因为阿里镜像库通常比官方npm仓库响应更快。 1. 配置全局镜像 可以通过运行以下命令来将npm的全局镜像配置为阿里镜像&#xff1…...

Apache JMeter压力测试工具使用

JMeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。 01 软件下载 下载地址: https://jmeter.apache.org/download_jmeter.cgi 最新版本5.6.2 用浏览器下载发现慢得很&#xff0c;用迅雷下载非常快哟。 02 测试使用 在使用前需要先安装jd…...

前端零基础入门到上班:【Day4】HTML 多媒体与表单深度教程

HTML 多媒体与表单深度教程 **1. HTML 多媒体基础&#xff1a;深入理解 <video> 和 <audio> 标签****1.1 <video> 标签&#xff1a;详细剖析与用法****1.1.1 基础结构与属性详解****1.1.2 视频格式的兼容性与示例****1.1.3 视频控制的实际应用** **1.2 <a…...

原创作品——银行软件产品界面设计

蓝蓝设计团队服务金融类应用界面设计&#xff0c;以沉稳的色调和简洁的线条营造出专业可靠的氛围。特点在于融入了创新的元素增添界面的活力与现代感。细节处理上&#xff0c;注意数据的视觉呈现效果&#xff0c;采用定制化的图表和清晰的排版&#xff0c;确保用户能够快速理解…...

若依RuoYi-Vue 定时任务 速学

1.若依定时任务模块&#xff08;ruoyi-quartz&#xff09; 那么从一个简单的入门示例开始&#xff0c;掌握定时任务的使用吧&#xff01; 2. 入门示例&#xff08;学会制作一个简单定时任务&#xff09; 首先打开定时任务模块中的task包&#xff0c;这里已经有一个已经写好的R…...

【pytest学习】pytest.main()

基本用法## pytest.main()函数是用于启动测试运行的入口点。它可以在命令行中直接使用&#xff0c;也可以在脚本中以编程方式调用。 以下是一个简单的示例&#xff1a; import pytest if __name__"__main__":pytest.main()执行当前目录下的所有测试文件 使用pytes…...

设计模式: Pimpl(Pointer to Implementation)

这种设计模式通常被称为 Pimpl&#xff08;Pointer to Implementation&#xff09;惯用法&#xff0c;有时也被称为 Cheshire Cat 惯用法。它主要用于隐藏实现细节和减少编译依赖。 例子&#xff1a; DatabaseConnection.h #ifndef DATABASE_CONNECTION_H #define DATABASE_…...

android开发中文网站 android developer

Android 平台 | Platform | Android Developers 在此做个记录...

实习冲刺Day1

算法题 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 这个题我们采用stack栈的方式来进行相应的括号匹配 情况有以下几种 当字符串s中只有一个字符的时候&#xff0c;那这个时候字符串一定是不匹配的所以直接返回false当字符串为发生标准匹配的时候&#xff0c;…...

安全见闻(5)——开阔眼界,不做井底之蛙

安全见闻五&#xff1a;人工智能 内容预览 ≧∀≦ゞ 安全见闻五&#xff1a;人工智能声明导语一、人工智能基础机器学习基础机器学习的典型工作流程1. 数据收集2. 数据预处理3. 模型选择与训练4. 模型评估与优化5. 模型应用 深度学习基础深度学习基本原理1. 神经网络基础2. 多层…...

Navicat 安装

Navicat 安装步骤...

解读 Java 经典巨著《Effective Java》90条编程法则,第2条:遇到多个构造器参数时要考虑使用构建器

《Effective Java》是由 Joshua Bloch 撰写的经典书籍&#xff0c;提供了 Java 编程中的最佳实践和建议。在书中的第2条建议“遇到多个构造器参数时要考虑使用构建器”&#xff0c;主要是为了处理构造器参数过多时的设计问题。这条建议的主要目的是简化构造器的使用&#xff0c…...

拉丁美洲有望成为全球电商的新蓝海!

拉美市场&#xff0c;被行业普遍认为“可能是中国跨境电商的最后一个蓝海市场”。越来越多的中国跨境电商卖家开始关注拉美市场&#xff0c;并且持续为拉美消费者提供更为优质的“中国制造”。 为什么大家会这么认为呢&#xff1f;原因可能有以下几个方面&#xff1a; 第一、拉…...

VScode远程开发之remote 远程开发(二)

VScode远程开发之remote 远程开发&#xff08;二&#xff09; 使用vscode进行远程开发很简单&#xff0c;在拓展里搜索 Remote Development&#xff0c;就可以搜索到微软提供的远程开发大礼包&#xff0c;里面包含了 通过 SSH 远程服务器 远程容器 远程 WSL&#xff08;Win…...

基于Python+SQL Server2008实现(GUI)快递管理系统

快递业务管理系统的设计与实现 摘要: 着网络新零售的到来&#xff0c;传统物流在网购的洗礼下迅速蜕变&#xff0c;在这场以互联网为基础的时代变革中&#xff0c;哪家企业能率先转变其工作模式就能最先分得一杯羹&#xff0c;物流管理也不例外。传统的物流管理模式效率低下&a…...

png格式图片怎么改成jpg?超好用的8种转换方法介绍!

png格式图片怎么改成jpg&#xff1f;PNG作为一种普遍存在的图片格式&#xff0c;在我们的日常生活中无处不在&#xff0c;从社交媒体分享到工作文档插图&#xff0c;都少不了它的身影&#xff0c;PNG格式的确拥有诸多优点&#xff0c;如无损压缩保留图像的所有细节与高质量&…...

Idea基于JRbel实现项目热部署修改Java、Xml文件无需重启项目

Idea基于JRbel实现项目热部署修改Java、Xml文件无需重启项目 1.JRbel服务安装2.JRbel插件安装3.JRbel配置 1.JRbel服务安装 直接装插件的话&#xff0c;需要用到一个服务地址&#xff0c;服务下载链接&#xff1a;&#xff08;现在没时间搞&#xff0c;会尽快加上&#xff09;…...

【如何获取股票数据17】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股近年增发数据获取实例演示及接口API说明文档

最近一两年内&#xff0c;股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步&#xff0c;就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息&#xff0c;这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…...

导出BERT句子模型为ONNX并推理

在深度学习中&#xff0c;将模型导出为ONNX&#xff08;Open Neural Network Exchange&#xff09;格式并利用ONNX进行推理是提高推理速度和模型兼容性的一种常见做法。本文将介绍如何将BERT句子模型导出为ONNX格式&#xff0c;并使用ONNX Runtime进行推理&#xff0c;具体以中…...

Unity Apple Vision Pro 自定义手势识别交互

Vision Pro 是可以使用Unity 提供的XR Hand SDK,可通过XR Hand制作自定义手势识别&#xff0c;通过识别出不同的手势做自定义交互 效果预览 在VisionPro中看VisionPro|手势交互|自定义手势识别 Unity Vision Pro 中文课堂教程地址&#xff1a; Unity3D Vision Pro 开发教程【…...

【Javaee】网络原理—TCP协议的核心机制

前言 TCP/IP五层协议是互联网中的主流模型&#xff0c;为网络通信提供了一个稳固的框架。 主要包含了应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;物理层。 本篇主要介绍传输层的TCP协议的核心机制 一. 确认应答&#xff08;ack&#xf…...

兰州微网站建设/湖南网站营销推广

安装postfixpostfix是一个快速、易于管理、安全性高的邮件发送服务&#xff0c;可以配合dovecot实现一个完美的邮箱服务器。1、安装postfix [rootlocalhost ~]# rpm -qa | grep postfix[rootlocalhost ]# yum install -y postfixLoaded plugins: fastestmirror, refresh-packag…...

微网站和微信公共平台的区别/广告优化师的工作内容

Linux是什么&#xff1f;linux是一个开源操作系统&#xff0c;是用于与计算机硬件打交道的中间层。操作系统管理系统资源&#xff0c;提供最基本的计算功能&#xff0c;如管理及配置内存&#xff0c;同时还提供一些基本的服务程序&#xff0c;如&#xff1a;文件系统、设备驱动…...

wordpress vip会员主题/seo发贴软件

如图 8‑28所示为某公司的员工基本信息表&#xff0c;如何快速地统计各部门的男女比例&#xff1f; 图8‑28鸿商公司员工基本信息表 解决方案 创建数据透视表&#xff0c;使用数据透视表值显示方式中的“行汇总的百分比”。 操作方法 行汇总的百分比 步骤1 创建数据…...

win2008iis配置网站/广州seo排名收费

1.RC电路 另一种更加直观的方法&#xff1a; 初始电压&#xff1a;V0 稳态响应&#xff1a;经过一段很长时间后&#xff0c;电容相当于开路&#xff0c;两端电压就就是VI 电路具有 1 - e -t/RC 的形式。 所以 得到 VcV0 (VI -V0) (1 - e -t/RC) 2.计算数字电路延迟 上升延迟&a…...

清远做网站/seo的方法

遗传算法是模拟生物在自然环境中的遗传和进化过程而形成的一种自适应全局优化概率搜索算法。最优化问题的目标函数和约束条件种类繁多&#xff0c;有的是线性的&#xff0c;有的是非线性的&#xff1b;有的是连续的&#xff0c;有的是离散的&#xff1b;有的是单峰值的&#xf…...

网站排行榜/口碑营销经典案例

svn安装&#xff1a; SVN1.6.11安装过程概述一.安装1.将subversion-1.6.11.tar.gz和subversion-deps-1.6.11.tar.gz传到服务器。tar xfvz subversion-1.6.11.tar.gztar xfvz subversion-deps-1.6.11.tar.gzchown -R root.root subversion-1.6.11cd subversion-1.6.11./configur…...