【C++ 学习 ②】- 类和对象(上)
目录
一、 面向对象的基本理念
1.1 - 什么是对象?
1.2 - 类和对象
1.3 - 面向对象的五条原则
1.4 - 面向过程 vs 面向对象
二、C++ 中的结构体
三、类的定义
3.1 - 类的两种定义方式
3.2 - 成员变量的命名规范
四、类的访问限定符和封装
4.1 - 访问限定符
4.2 - 封装
五、类的实例化
六、类的存储方式
七、this 指针
7.1 - this 指针的引入
7.2 - this 指针的特性
7.3 - 练习
参考资料:
浙江大学 C++ 翁恺老师。
【C++】什么是对象?什么是类?_c++ 里的 对象定义。
面向过程 VS 面向对象 - 知乎 (zhihu.com)。
一文带你入门C++类和对象【十万字详解,一篇足够了】。
一、 面向对象的基本理念
1.1 - 什么是对象?
-
Object = Entity
-
Object may be visible or invisible.
-
Object is variable in programming languages.
在现实世界中,任何事物都是对象。
它可以是有形的具体存在的事物,例如一张凳子、一台电脑、一个学生、一辆汽车等,也可以是无形的抽象的事物,例如一次演出、一场球赛等。
在程序设计语言中,对象实际上就是变量。
-
Objects = Atrributes + Services

Data: the properties or status
Operations: the functions
对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
例如,一个学生就是一个对象,学生的学号、姓名和成绩等数据就是他的属性,输入或输出学号、姓名和成绩等就是对数据施加的一组操作。
-
Object send and receive messages(objects do things!)

Messages are
—Composed by the sender
—Interpreted by the receiver
—implemented by the methods
Message
—May cause receiver to change state
—May return results
每个对象都有自己的属性和行为,对象和对象之间通过方法来交互。
1.2 - 类和对象

-
Objects(cat)
Represent things, events, or concepts
Respond to messages at run-time
-
Classes(cat class)
Define properties of instances
Act like types in C++
类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,对象又是类的个体实物,一个对象是类的一个实例。
1.3 - 面向对象的五条原则
-
Everything is an object.
-
A program is a bunch of objects telling each other what to do by sending messages.
-
Each objects has its own memory made up of other objects.
-
Every object has a type.
-
All objects of a particular type can receive the same messages.
第五条原则可以分别两个方面来理解。从正面理解,即一个特定类型的所有对象可以接受相同的消息;从反面理解,即所有可以接受相同消息的对象可以被认为是同一类型。
1.4 - 面向过程 vs 面向对象

面向过程(Procedure Oriented,简称 PO)是以 "事件" 为中心的编程思想,编程的时候首先把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
以五子棋为例,面向过程的设计思路是首先分析解决这个问题的步骤,即:
(1) 开始游戏 (2) 黑子先走 (3) 绘制画面 (4) 判断输赢 (5) 白子再走 (6) 绘制画面 (7) 判断输赢 (8) 返回步骤(2) (9) 输出最后结果
然后用函数实现上面一个一个的步骤,在一步一步的具体步骤中再按顺序调用函数。

面向对象(Object Oriented,简称 OO)是一种以 "对象" 为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个对象在整个解决问题的步骤中的属性和行为。
在五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:
(1) 黑白双方,这两方的行为是一样的
(2) 棋盘系统,负责绘制画面
(3) 规则系统,负责判定犯规、输赢等
然后赋予每个对象一些属性和行为:
第一类对象(黑白双方)负责接受用户输入,并告知第二类对象(棋盘系统)棋子布局的变化,棋盘系统接受到了棋子的变化,并负责在屏幕上显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
二、C++ 中的结构体
C 结构体中只能包含成员变量,而 C++ 结构体的成员不仅可以是变量,还可以是函数。
C doesn't support the relationship between data and functions.
用 C 和 C++ 分别实现栈时,Stack.h 中的内容分别应该是:
<C 版本>:
#pragma once
#include <stdbool.h>
// 动态顺序栈
typedef int STDataType;
typedef struct Stack
{STDataType* data;int top;int capacity;
}Stack;
// 基本操作
void StackInit(Stack* pst, int default_capacity); // 初始化
bool StackEmpty(Stack* pst); // 判断是否为空栈
void StackPush(Stack* pst, STDataType x); // 入栈
void StackPop(Stack* pst); // 出栈
STDataType StackTop(Stack* pst); // 返回栈顶元素
int StackSize(Stack* pst); // 返回栈的有效元素个数
void StackDestroy(Stack* pst); // 销毁
<C++ 版本>:
#pragma oncetypedef int STDataType;
struct Stack
{
public:void Init(int default_capacity = 5); // 初始化bool Empty(); // 判断是否为空栈void Push(const STDataType& x); // 入栈void Pop(); // 出栈STDataType Top(); // 返回栈顶元素int Size(); //返回栈的有效元素个数void Destroy(); // 销毁
private:STDataType* _data;int _top;int _capacity;
};
问题:
public adj. 公开的;private adj. 私密的
这两个关键字的作用是什么(大概可以知道,该结构体仅公开对外的接口,而隐藏内部的数据)?
成员变量名前面为什么要加一个下划线(
_)?在 C++ 中更喜欢用关键字 class 来代替 struct,那么 struct 和 class 的异同是什么?
成员函数又该如何定义?
三、类的定义
语法格式:
class className
{// 类的成员,包括成员函数(类的方法)和成员变量(类的属性)
}; // 分号不能省略
3.1 - 类的两种定义方式
在 C++ 中,通常用一个 .h 和一个 .cpp 文件定义一个类(例如 Stack.h 和 Stack.cpp)。① 声明放在 .h 文件中,成员函数定义则放在 .cpp 文件中。
由于类定义了一个新的作用域,即类作用域,所以在类体外定义成员函数,需要加作用域。例如:
Stack.cpp:
#include "Stack.h"
#include <stdlib.h>
#include <assert.h>
// 初始化
void Stack::Init(int default_capacity)
{_data = (STDataType*)malloc(sizeof(STDataType) * default_capacity);if (nullptr == _data){perror("initialization failed!");exit(-1);}_top = 0;_capacity = default_capacity;
}
// 判断是否为空栈
bool Stack::Empty()
{return _top == 0;
}
// 入栈
void Stack::Push(const STDataType& x)
{if (_top == _capacity){STDataType* tmp = (STDataType*)realloc(_data, sizeof(STDataType) * 2 * _capacity);if (nullptr == tmp){perror("realloc failed!");return;}_data = tmp;_capacity *= 2;}_data[_top++] = x;
}
// 出栈
void Stack::Pop()
{assert(!Empty()); // 前提是栈非空--_top;
}
// 返回栈顶元素
STDataType Stack::Top()
{assert(!Empty()); // 前提是栈非空return _data[_top - 1];
}
//返回栈的有效元素个数
int Stack::Size()
{return _top;
}
// 销毁
void Stack::Destroy()
{free(_data);_data = nullptr;_top = _capacity = 0;
}
② 成员函数的定义也可以放在类体中,此时编译器可能会将其当成内联函数处理。
3.2 - 成员变量的命名规范
#include <iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){year = year;month = month;day = day;}void Display(){cout << year << "-" << month << "-" << day << endl;}
private:int year;int month;int day;
};
int main()
{Date d;d.Init(2023, 5, 1);d.Display(); // 随机值(说明初始化失败)return 0;
}

由此可以发现,当成员变量和形参同名时,是无法完成初始化的。类似于:
#include <iostream>
using namespace std;
int g_val = 10;
int main()
{int g_val = 20;g_val = g_val; // 该语句并不会将全局变量 g_val 的值赋值给局部变量 g_valcout << g_val << endl; // 20return 0;
}
解决方案如下:
class Date
{
public:void Init(int year, int month, int day){// 一、加作用域/*Date::year = year;Date::month = month;Date::day = day;*/// 二、使用 this 指针(后面会详解)/*this->year = year;this->month = month;this->day = day;*/// 三、对成员变量名进行修改_year = year;_month = month;_day = day;}void Display(){cout << year << "-" << month << "-" << day << endl;}
private:int _year; // 或者 mYear, m 即 memberint _month; // 或者 mMonthint _day; // 或者 mDay
};
四、类的访问限定符和封装
4.1 - 访问限定符

-
public 修饰的成员在类内和类外都可以直接被访问。
-
protected 和 private 修饰的成员在类外不能直接被访问(此处 protected 和 private 是类似的)。
-
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到
},即类结束。 -
class 的默认访问权限是 private,struct 为 public。
因为 C++ 要兼容 C,所以在 C++ 中 struct 可以当作结构体使用,也可以用来定义类,和用 class 定义类是一样的,区别在于 struct 定义的类的默认访问权限是 public,class 定义的类的默认访问权限是 private。
注意,在继承和模板参数列表位置,struct 和 class 也有区别,后续进行讲解。
4.2 - 封装
面向对象的三大特性:封装、继承和多态。
封装(encapsulation):将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
capsule n. 胶囊
封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入、显示器、USB 插孔等,让用户和计算机进行交互,完成日常事物。但实际上工作的却是 CPU、显卡、内存等一些硬件原件。

对于计算机使用者而言,不用关心内部核心部件,比如主板上路线是如何布局的,CPU 内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关、鼠标及键盘插孔等,让用户可以与计算机进行交互即可。
在 C++ 中实现封装,可以通过类将数据及操作数据的方法进行有机结合,通过访问权限来隐藏对象的属性和实现细节,控制哪些方法可以在类外直接被使用。
五、类的实例化
用类创建对象的过程,称为类的实例化。
-
类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义一个类并没有分配实际的内存空间来存储它。
-
一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量。
做个比方,类实例化对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
六、类的存储方式
类对象的存储方式猜测:
-
对象中包含类的各个成员:

显然,这种存储方式的一大缺陷在于,当创建多个对象时,每个对象的成员变量不同,但成员函数是相同的,因此会存在多份相同的代码,造成空间浪费。
-
相同的代码只保存一份,在对象中存放代码的地址:

-
只保存成员变量,成员函数存放在公共的代码段:

实际上是采用第三种存储方式。
#include <iostream>
using namespace std;
class A
{
public:void Init(char c1, int i, char c2);void Print();
private:char _c1;int _i;char _c2;
};
void A::Init(char c1, int i, char c2)
{_c1 = c1;_i = i;_c2 = c2;
}
void A::Print()
{cout << _c1 << " " << _i << " " << _c2 << endl;
}
int main()
{cout << sizeof(A) << endl; // 12(注意:存在内存对齐)return 0;
}
注意:对于只有成员函数的类和空类,
sizeof(classNmae)为 1(编译器给一个字节来唯一标识这个类的对象)。
七、this 指针
7.1 - this 指针的引入
#include <iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Display(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2;d1.Init(2023, 5, 1);d2.Init(2023, 5, 2);d1.Display(); // 2023-5-1d2.Display(); // 2023-5-2return 0;
}
问题:Date 类中有 Init 和 Display 两个成员函数,函数体中没有关于不同对象的区分,那么当 d1 调用 Init 和 Display 函数时,这两个函数是如何知道初始化和显示的对象是 d1,而不是其他,例如 d2,对象呢?
解答:C++ 编译器给每个 "非静态的成员函数" 增加一个隐藏的指针参数 this,让该指针指向当前对象(函数运行时调用该函数的对象)。在函数体中所有 "成员变量" 的操作,都是通过该指针去访问,只不过所有的操作对用户是透明的,即用户不需要传递,编译器自动完成。
#include <iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;// 可以在成员函数内部显示地使用 this 指针cout << "this = " << this << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2;
cout << "&d1 = " << & d1 << endl;d1.Init(2023, 5, 1);// 输出的两个地址相同
cout << "&d2 = " << & d2 << endl;d2.Init(2023, 5, 2);// 输出的两个地址也相同return 0;
}
7.2 - this 指针的特性
-
this 为指针常量,即在成员函数中,不能改变 this 的指向。
-
this 指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给 this 形参,所以对象中不存储 this 指针。

d1.Init(2023, 5, 1); // 可以视为 Date::Init(&d1, 2023, 5, 1); d1.Display(); // 可以视为 Date::Display(&d1); // 注意:不能显示地将对象的地址传递给 this 指针, // 所以 Date::Init(&d1, 2023, 5, 1); 和 Date::Display(&d1); 实际上是不被允许的 -
this 指针是成员函数第一个隐含的指针形参,一般情况由编译器通过 ecx 寄存器自动传递,不需要用户传递。

7.3 - 练习
#include <iostream>
using namespace std;
class A
{
public:void f() {cout << "f()" << endl;}
private:int _i;
};
int main()
{A* pa = nullptr;pa->f(); return 0;
}
问:上面程序编译运行的结果是()?
编译报错
运行崩溃
正常运行
pa->f();可以被视为A::f(pa);,this 指针为空,但在函数内部没有对 this 指针进行解引用,所以并不会出现运行错误,而是正常输出 "f()"。
相关文章:
【C++ 学习 ②】- 类和对象(上)
目录 一、 面向对象的基本理念 1.1 - 什么是对象? 1.2 - 类和对象 1.3 - 面向对象的五条原则 1.4 - 面向过程 vs 面向对象 二、C 中的结构体 三、类的定义 3.1 - 类的两种定义方式 3.2 - 成员变量的命名规范 四、类的访问限定符和封装 4.1 - 访问限定符 …...
最好的物联网教程:软硬结合——从零打造物联网
在大学里不同专业有着不同的追求:机械类与强电类专业学生追求的是 “机电合一” ,既懂机械又懂电气,整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” ,既懂硬件又懂软件,整个电子产品便能打通。我作…...
猫狗训练集训练报错:Failed to find data adapter that can handle input
这里写自定义目录标题 Jupyter Notebook6.5.4 tensorflow 2.12.0 pillow 9.5.0 numpy 1.23.5 keras 2.12.0 报错详细内容: ValueError: Failed to find data adapter that can handle input: (<class ‘tuple’> containing values of types {“<class ‘k…...
中国网络安全人才需求
如果你是一个想要入门网络安全行业的小白、如果你是网络安全专业在读的大学生、如果你是正在找工作的新手,那么这篇文章你一定要仔细看。毕竟知己知彼百战百胜,知道行业的人才需求才能更好得发挥自己的优势。 当你打开BOSS直聘、拉钩等招聘网站…...
设计模式之组合模式
目录 1、组合模式的定义 2、组合模式例子 3、组合模式实现 3.1 组合模式的结构 3.2 组合模式的分类 3.3 组合模式代码实现(透明组合模式) 4、组合模式的优点 5、组合模式使用场景 1、组合模式的定义 组合模式又名部分整体模式,是用于把…...
计算机基础书籍
一操作系统 二常见问题总结 1.操作系统的特征? 并发、共享、虚拟、异步性 2.进程阻塞与唤醒的条件 等待 I/O 操作完成请求系统资源失败等待信号量或事件等待子进程结束被高优先级进程抢占 3.如何避免死锁? 1、避免资源竞争 2、破坏循环等待条件 3、优…...
保龄球游戏的获胜者、找出叠涂元素----2023/4/30
保龄球游戏的获胜者----2023/4/30 给你两个下标从 0 开始的整数数组 player1 和 player2 ,分别表示玩家 1 和玩家 2 击中的瓶数。 保龄球比赛由 n 轮组成,每轮的瓶数恰好为 10 。 假设玩家在第 i 轮中击中 xi 个瓶子。玩家第 i 轮的价值为: …...
jQuery事件
1. jQuery事件注册 单个事件注册 语法: element.事件(function(){}) eg:$(“div”).click(function(){ 事件处理程序 }) 其他事件和原生基本一致。比如mouseover、mouseout、blur、focus、change、keydown、keyup、resize、scroll 等 <!DOCTYP…...
初识SpringCloud
一、软件架构演进 单体架构 垂直架构 分布式架构 SOA架构 微服务架构 二、微服务架构 2.1 微服务理念 "微服务”一词源 于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到http://martinfowler.com/articles/microservices.html微服务是系统架构上…...
安装java配置
目录 安装JDK 编辑 环境变量配置 3、检验环境变量配置 二、安装tomcat 验证Tomcat配置是否成功 三、安装Mysql 一、安装 二、卸载 四、安装Maven 安装JDK 点击更改将C直接给为F即可。 点击确定后进行安装,安装完以后会提示安装JRE; 检测是否已经安装JDK的…...
KBO的选秀会有哪些规定和流程`棒球7号位
KBO(韩国职业棒球联盟)的选秀会有以下规定和流程: 1. 选秀对象:KBO的选秀会主要面向年满18岁及以上的高中和大学生,以及海外球员和自由球员。KBO的球队可以在选秀会中挑选所需的球员,每个球队有一定数量的选…...
男子订民宿被毁约5个家庭漂泊街头 房东:住满了,没办法
据媒体报道,5月1日,一位叫做诸先生的消费者和朋友们提前在平台上预订了五一假期前往青岛金沙滩地中海两天的别墅民宿,并支付了房款9600元。 但是当他们到达目的地前一个半小时联系房东时,却发现联系不上人。到达指定地点后&#x…...
Vue快速入门,常用指令,生命周期
Vue常用指令 案例: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…...
【热门框架】Mybatis-Plus入门介绍看这一篇文章就足够了
MyBatis-Plus 是在 MyBatis 的基础上进行了封装,提供了更加便捷的开发方式,具有简化开发、提高效率等优点。以下是 MyBatis-Plus 的一些特点和用法: 通用 CRUD 操作:MyBatis-Plus 提供了通用的 CRUD 接口,可以直接调用…...
Node【Node.js 20】新特性
文章目录 🌟前言🌟Node.js 20: 一次重要的升级和改进🌟Internationalization API Update🌟端口管理器🌟字符串处理🌟 更好的调试工具🌟 Crypto模块的更新🌟总结🌟写在最后…...
前端程序员的职业发展规划与路线——ChatGPT的回答
文章目录 一、前端程序员的职业规划是?回答1: 作为一个前端开发程序员,您的职业发展路线可能如下:回答2:作为前端开发程序员,您的职业发展路线可能如下:回答3: 你的职业发展路线可能…...
AlgoC++第八课:手写BP
目录 手写BP前言1. 数据加载2. 前向传播3. 反向传播总结 手写BP 前言 手写AI推出的全新面向AI算法的C课程 Algo C,链接。记录下个人学习笔记,仅供自己参考。 本次课程主要是手写 BP 代码 课程大纲可看下面的思维导图 1. 数据加载 我们首先来实现下MNIST…...
【Java笔试强训 27】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥 不用加…...
java紫砂壶交易购物系统 mysql
网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传,大大达到了陶瓷业的“色型”要求。实现产品管理方便,起到立竿见影的效果,不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点,全线马上更新。采用B/S模式&#x…...
7-4 多态练习-计算面积
定义三个类,父类(抽象类)GeometricObject代表几何形状,子类Circle代表圆形,子类Rectangle代表矩形。具体属性和方法如下: 父类 (抽象类)GeometricObject 属性: private String color; private S…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

