C嘎嘎~~[类和对象 精华篇]

news2024/12/24 10:04:17

类和对象 精华篇

  • static成员
    • 引入
    • 特点
    • 问题收尾
  • 友元
    • 友元函数
    • 友元类
  • 内部类
  • 理解 类和对象

static成员

引入

🗨️[题目] 实现一个类,计算程序中创建出了多少个类对象

  • 先分析一下题目: 程序运行中, 有对象的创建, 也有对象的销毁 ⇒ 对应下来就是 构造,拷贝构造 和 析构
    对象创建出来要初始化 — — 构造和拷贝构造, 对象到了生命周期就要销毁 — — 析构
    那我们可以用一个 全局变量来记录一下就可以了. 下面我用的是 Count
int Count = 0;

class A
{
public:
	A(int x) // 构造
	{
		Count++;
	}

	A(const A& x) // 拷贝构造
	{
		Count++;
	}

	~A() // 析构
	{
		Count--;
	}

private:
	int _a;
};

void func(A tem)
{
	cout << __LINE__ << ':' << Count << endl; // 504:4
}

int main()
{
	A a1(1);
	A a2(2);
	cout << __LINE__ << ':' << Count << endl; // 511:2

	A a3 = 4;
	cout << __LINE__ << ':' << Count << endl; // 514:3

	func(a1);
	cout << __LINE__ << ':' << Count << endl; // 517:3

}

*****
511:2
514:3
504:4
517:3
*****
  • 其实通过上面的例子 514: 3, 也证明了之前讲的 隐式类型转换⇒ 构造 + 拷贝构造 ⇒ 系统会将它优化成一个构造
    但其实上面的写法有一个问题: 可以随意改变 👇👇👇

上面的错误写法就要求要 封装Count,

  1. 设置一个作用域, 使得我们的Count 不能轻易被改变.
  2. 还有就是 可以不用对象去访问. [你想啊, 我们这个Count是用来展示的, 如果每一次都用对象去访问, 那么就是展示一个Count就必须创建一个对象 且 缺少灵活性]

特点

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量.

🗨️我们认为 静态成员变量 就是普通的成员变量, 并没有什么区别??

  • 先看看初始化吧, 一般的成员变量初始化都是构造函数(初始化列表), 当我们给静态成员变量一个缺省值, 实则是想传给初始化列表的⇒ 以此来看看静态成员变量 跟 普通成员变量的初始化有何不同!!
class A
{
public:
	A(int x) // 构造
	{
		_Count++;
	}

	A(const A& x) // 拷贝构造
	{
		_Count++;
	}

	~A() // 析构
	{
		_Count--;
	}

private:
	int _a = 0;
	static int _Count = 0;
};


⇒ 可见, 静态成员变量不是在初始化列表中进行初始化的. 那么问题就接踵而至👇👇👇

先插一句:
根据前面所学知识, 我们知道了初始化列表是对象变量定义的地方

🗨️静态成员变量是怎么进行初始化的?? 静态成员变量是不属于对象的吗??



  • 我们知道 static修饰的对象是存储在 [静态区] 的, 而不是存储在 [栈区]即 对象空间

    普通的成员变量 — — 是属于对象的, 存储在对象里面
    静态成员变量 — — 是属于整个类的, 即被类中的所有对象共享, 存储在静态区

    所以, 静态成员变量是不能在类中进行初始化的, 必须在 全局进行初始化
    由于是初始化, 是不受访问限定符 (public 和 private)限制的, 但是你要表明你这个变量来自哪里⇒ 即受类域的限制
    ⇒ 所以, 要用 :: 来进行访问
    🗨️老陈, 你之前不是说用 类名 :: 成员变量 是错误的吗 ??
  • 这个地方, 当做特殊情况处理.
    其实这个地方, 你也可以这样想: 把_Count 想作是一个全局变量, 只不过它受作用域的限制, 不能随意进行修改罢了

所以通过前面的铺垫, 我们得出了静态成员变量的几个特点:

1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明

初始化问题解决了, 那我们考虑一下 访问问题
🗨️既然 初始化的时候不受 访问限定符的限制, 那么访问的时候, 我们也假设不受访问限定符的限制 !!

  • 先看看下面的代码👇👇👇
class A
{
public:
	A() // 构造
	{
		_Count++;
	}

	A(const A& x) // 拷贝构造
	{
		_Count++;
	}

	~A() // 析构
	{
		_Count--;
	}

private:
	int _a = 0;
	static int _Count;
};

int A::_Count = 0;

int main()
{
	cout << A::_Count << endl;

	return 0;
}


显然, 我们发现访问静态成员变量是受访问限定符的限制 .
那我们该如何在类的外面来访问静态成员变量

  1. 把private 变成 public
    1. 可以直接用 类名 :: 静态成员变量 来进行访问.
    2. 可以创建对象, 用 对象.静态成员变量 来进行访问.
class A
{
public:
	A() // 构造
	{
		_Count++;
	}

	A(const A& x) // 拷贝构造
	{
		_Count++;
	}

	~A() // 析构
	{
		_Count--;
	}

public:
	int _a = 0;
	static int _Count;
};

int A::_Count = 0;

int main()
{
	// 可以不创建对象, 直接用 类名 :: 静态成员变量 来进行访问
	cout << A::_Count << endl;

	// 可以创建对象, 用 对象.静态成员变量 来进行访问
	A a1;
	cout << a1._Count << endl;

	return 0;
}

*****
0
1
*****
  1. 在类里面写一个公有函数
    • 我们知道在类里面是不受访问限定符 和 类域的限制⇒ 那么我们就可以在 公共区段函数(public)中写一个能够得到静态成员变量的值 的函数. 不过有几个缺点:
        1. 只能使用对象去访问
        1. 只能获取到静态成员变量当时的一个值, 不能进行修改
class A
{
public:
	A() // 构造
	{
		_Count++;
	}

	A(const A& x) // 拷贝构造
	{
		_Count++;
	}

	~A() // 析构
	{
		_Count--;
	}

	int GetCount()
	{
		return _Count;
	}

private:
	int _a = 0;
	static int _Count;
};

int A::_Count = 0;

int main()
{
	A a1;
	cout << a1.GetCount() << endl;

	return 0;
}

*****
1
*****

通过上面问题的铺垫, 我们可以看出静态成员变量的几个特点:

3.静态成员也是类的成员,受public、protected、private 访问限定符的限制
4.类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问

🗨️老陈, 前面那个引入的题目中, 尽量能不用对象就能访问 静态成员变量. 如果静态成员变量用 [private] 来限定, 那么当前就必须用对象来访问静态成员变量. 有没有一种办法是可以不用对象就可以访问, 就跟静态成员变量初始化那样 用 类名 :: 静态成员变量 就可以访问 ??


  • 先介绍一下 静态成员函数的双胞胎弟弟 — — 静态成员函数
    用static修饰的成员函数,称之为静态成员函数
    先剧透一下, 这个静态成员函数就能完美地解决这个问题👇👇👇
class A
{
public:
	A() // 构造
	{
		_Count++;
	}

	A(const A& x) // 拷贝构造
	{
		_Count++;
	}

	~A() // 析构
	{
		_Count--;
	}

	static int GetCount() // 静态成员函数
	{
		return _Count;
	}

public:
	int _a = 0;
	static int _Count;
};

int A::_Count = 0;

int main()
{
	cout << A::GetCount() << endl;

	return 0;
}

*****
0
*****

🗨️静态成员函数能用类名 :: 静态成员函数的原理是什么??


  • 先看一下普通成员函数的最大特点 — — this指针, 它有没有👇👇👇

    这个时候, 我们就恍然大悟了 — — 由于静态成员函数没有this指针, 所以不需要对象来进行访问.
    再加上 静态成员变量只要突破类域 和 访问限定符 的限制, 就能进行访问
    由于静态成员变量是属于整个类的, 不是属于某一个对象的; 静态成员函数是没有this指针的⇒ 在类外面突破类域就只能用 类名 :: 这种方法了. [普通的成员变量突破类域直接创建一个对象就行, 普通的成员函数突破类域也必须依靠对象.]
    ⇒ 公共函数区段的静态成员函数的访问就可以用 类名 :: 静态成员函数
    ⇒ 当然, 没有this指针, 静态成员函数就不能访问非静态成员变量

5.静态成员函数没有隐藏的this指针,不能访问任何非静态成员

总结一下静态成员变量/ 静态成员函数 的特点:

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

问题收尾

[问题]

  1. 静态成员函数可以调用非静态成员函数吗?

    由于静态成员函数没有this指针, 而非静态成员函数又需要this指针⇒ 静态成员函数不能调用非静态成员函数.

  2. 非静态成员函数可以调用类的静态成员函数吗?

    非静态成员函数有隐藏的this指针, 但是静态成员函数不需要this指针; 不过两者并不干扰⇒ 非静态成员函数可以调用静态成员函数.

友元

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度(依赖性增强了),破坏了封装,所以友元不宜多用

友元函数

通过前面的学习, 我们知道了 有一种情况:
我们的普通函数必须定义在类外面, 但是我们必须要使用类中的私有成员变量 — — 我们的 重载 << 和 重载 >> 就是这样的一个函数
这个时候就需要用 友元 来解决问题

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声
明,声明时需要加friend关键字

class Date
{
	// 这里只是声明一下 -- 这个函数是我的 '朋友', 可以使用我的 '东西'
	friend ostream& operator<<(ostream& _cout, const Date& d);
	friend istream& operator>>(istream& _cin, Date& d);

public:
	Date(int year = 2023, int month = 5, int day = 23)
		: _year(year)
		, _month(month)
		, _day(day)
	{}

private:
	int _year;
	int _month;
	int _day;

};

ostream& operator<<(ostream& _cout, const Date& d)
{
	_cout << d._year << "-" << d._month << "-" << d._day;
	return _cout;
}

istream& operator>>(istream& _cin, Date& d)
{
	_cin >> d._year;
	_cin >> d._month;
	_cin >> d._day;
	return _cin;
}

int main()
{
	Date d;
	cin >> d;
	cout << d << endl;

	return 0;
}
  • 注意: 对于友元, 如果有代替方案, 就不要使用友元. 因为它是一个 特例, 破坏了封装
  • 总结:
    • 友元函数可访问类的私有和保护成员,但不是类的成员函数
    • 友元函数不能用const修饰
      • 因为友元函数不是类的成员函数, 是没有this指针的. const修饰函数, 就是修饰this指针⇒ 故友元函数不能用const修饰
    • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
    • 一个函数可以是多个类的友元函数
    • 友元函数的调用与普通函数的调用原理相同

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员.

class Time
{
	friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量

public:
	Time(int hour = 0, int minute = 0, int second = 0)
		: _hour(hour)
		, _minute(minute)
		, _second(second)
	{}

private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}

	void SetTimeOfDate(int hour, int minute, int second)
	{
		// 直接访问时间类私有的成员变量
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}

private:
	int _year;
	int _month;
	int _day;
	Time _t;
};

由于友元的知识很简单, 这里都是直接上代码看看就行了
[总结]:

  1. 搞懂谁是谁的友元 — — Date类 是 Time类的友元⇒ Date类里面可以访问Time类中的私有成员, 而Time类就不能访问Date类的私有成员
  2. 友元具有单向性, 不具有交换性 — — Time类 不是 Date类的友元
  3. 友元不具有传递性 — — 小明是小红的好朋友, 小鹏是小红的好朋友, 小明和小鹏不一定是好朋友
  4. 友元关系不能继承,在继承位置再给大家详细介绍

内部类

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外
部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限.

首先, 先看一看内部类的基本形式👇👇👇

class A
{
private:
	static int _k;
	int _h;

public:

	class B // B是A的内部类
	{
	public:
		void foo(const A& a)
		{
			cout << _k << endl;
			cout << a._h << endl;
		}

	private:
		int _tem;
		int _b;

	};
};

🗨️如何证明内部类不包含在外部类, 是一个独立的类?

  • 分下面的两种思路:
  1. sizeof(外部类)

  2. 用外部类的对象去访问内部类的成员

    ⇒ 结合上面两种结果, 我们不难发现: 内部类是不在外部类中的, 只是定义在外部类中

🗨️如果我们想在 main函数里面创建一个 B对象, 那该怎么创建?

  • 虽然, 我们的内部类是不属于外部类的, 但是定义在外部类里面
    类 — — 一个作用域, 那么创建一个内部类对象就必须突破外部类的限制, 即要使用::
    上面的 B类是定义在A类的 public区段, 就可以不受访问限定符的限制
    ⇒ 所以, 在 main函数里面创建一个内部类对象: 外部类::内部类 对象
A :: B b;

🗨️友元是声明, 所以声明的位置没有限制. 内部类是一种定义, 那么它的定义位置有没有限制呢?



  • 内部类的位置也是没有限制的, 但是对外面创建对象是有影响的⇒ 从这个就可以看出, 是受访问限定符限制的

插一句话:
访问限定符限定的是成员的访问方式, 而成员包括成员变量 和 成员函数
而只有在类中定义的东西才会受访问限定符的限制. 比如成员变量, 成员函数, 内部类

  • 内部类是外部类的天生友元. 内部类可以访问外部类的私有成员, 而外部类却不能访问内部类的成员(内部类的访问权限高于外部类). 对于外部类不能访问内部类的成员⇒ 建议把成员变量写在外部类中, 这样大家都可以用
  • 内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名

[总结]:

  • 内部类是一个独立类, 不属于外部类⇒ 加了一层作用域
  • 内部类是外部类的一个天生友元
  • 内部类受访问限定符 和 类域的限制
  • 内部类可以定义在外部类的public、protected、private

理解 类和对象

现实生活中的实体计算机并不认识,计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的
实体,用户必须通过某种面向对象的语言,对实体进行描述,然后通过编写程序,创建对象后计算机才可以
认识。比如想要让计算机认识洗衣机,就需要:

  1. 用户先要对现实中洗衣机实体进行抽象—即在人为思想层面对洗衣机进行认识,洗衣机有什么属性,有
    那些功能,即对洗衣机进行抽象认知的一个过程
  2. 经过1之后,在人的头脑中已经对洗衣机有了一个清醒的认识,只不过此时计算机还不清楚,想要让计
    算机识别人想象中的洗衣机,就需要人通过某种面相对象的语言(比如:C++、Java、Python等)将洗衣
    机用类来进行描述,并输入到计算机中
  3. 经过2之后,在计算机中就有了一个洗衣机类,但是洗衣机类只是站在计算机的角度对洗衣机对象进行
    描述的,通过洗衣机类,可以实例化出一个个具体的洗衣机对象,此时计算机才能洗衣机是什么东西。
  4. 用户就可以借助计算机中洗衣机对象,来模拟现实中的洗衣机实体了。
    在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有那些属性
    那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象

It is not enough to be industrious, so are the ants. What are you industrious about?
光勤劳是不够的,蚂蚁也是勤劳的。要看你为什么而勤劳。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux服务器断电重启后,发现时间误差八小时

文章目录 问题现象排查与解决时间同步与设置服务器时钟介绍 问题现象 客户的服务器已部署好平台&#xff0c;放入了机房&#xff0c;运行正常。服务器系统时间设置东八区&#xff08;CST&#xff09;&#xff0c;时间日期也已修改正确客户是我省的某小县城&#xff0c;某台晚上…

28 KVM管理系统资源-绑定QEMU进程至物理CPU

文章目录 28 KVM管理系统资源-绑定QEMU进程至物理CPU28.1 概述28.2 操作步骤 28 KVM管理系统资源-绑定QEMU进程至物理CPU 28.1 概述 QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内&#xff0c;从而保证了运行不同业务的虚拟机不会干扰到邻位虚拟机。例如在一个…

ArcMap:第一届全国大学生GIS技能大赛(滁州学院)详解-下午题

目录 01 题目 02 数据 2.1 主要沟谷文件 2.2 DEM数字高程文件 2.3 气象站点数据 2.4 系统设计相关的DLL等文件 03 思路 3.1 作物生长条件的思路 3.1.1 对于条件1 3.1.2 对于条件2 3.1.3 对于条件3 3.1.4 对于条件4 3.2 水系的提取 3.3 种植面积的计算 04 实操 …

linux下cpu占用率100%怎么解决?

在实际的生产环境中&#xff0c;常常会遇到服务器CPU爆满的问题&#xff0c;这时候&#xff0c;正确的排查方法&#xff0c;有助于快速的定位问题。 1、找到最耗CPU的进程 使用top命令查看系统总体的CPU和内存使用情况&#xff0c;以及各个进程的资源使用情况。 2、找到最耗…

迈向5.5G丨美格智能持续创新,为智能世界创造新价值

5月11日&#xff0c;2023 “高通&美格智能物联网技术开放日”深圳站活动举行&#xff0c;美格智能高级产品总监在活动中发表题为《迈向5.5G&#xff0c;智联新未来》的主题演讲&#xff0c;分享了美格智能在5G技术演进中的创新实践。 ▲美格智能高级产品总监 刘伟鹏 ▌技术…

【基础折线图】学习使用flask、echarts搭建数据可视化图表网页

文章目录 前言Apache EchartsNPM 安装 ECharts在线定制 ECharts使用 Echarts Flaskpip安装flask 学习案例案例目录html代码flask代码 源码地址 前言 本文中的所有代码&#xff0c;全部都有详细注释&#xff0c;有需要的同学可以在文末领取&#xff01; 数据可视化是数据分析必…

19-01 技术选型的道与术

系列目录导航&#x1f449; 什么是技术选型&#xff0c;技术选型的重要性 根据实际业务管理的需要&#xff0c;对硬件、软件以及所要用到的技术进行规格的选择狭义上的技术选型&#xff1a;团队决定选用哪种技术去解决问题&#xff0c;比如选用某个技术语言、某个技术框架去开…

Android12之模板类单例模式实现原理(一百五十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

openGauss 年度大型开发者会议来袭,快来看看都有哪些SIG组参加!

openGauss Developer Day 2023 将于5月26日在北京举办。作为大会的重要环节&#xff0c; SIG组版本规划工作会议 将汇聚社区各个SIG 组的用户与开发者&#xff0c;与大家见面&#xff0c;共同讨论开源数据库的技术发展与创新。属于开发者的狂欢日&#xff0c;期待大家的到…

CMAKE命令详解

目录 CMake 语法 案例&#xff1a; 面试中给可能会问的问题和回答&#xff1a; 总结&#xff1a; CMake 是一个用于构建和管理跨平台软件项目的开源工具。它使用名为 CMakeLists.txt 的文本文件来描述项目的构建过程。 CMake 语法 当使用 CMake 构建项目时&#xff0c;可以…

数据库索引结构(1)概念

常见的索引 主键和二级索引 MySQL学习笔记-主键索引和二级索引_mysql中主键索引和二级索引的区别_爱因诗贤的博客-CSDN博客 MYSQL-主键索引与二级索引_mysql二级索引存在哪个文件_青苔小榭的博客-CSDN博客 采用主键索引的好处&#xff1a;如果元素的位置发生修改&#xff0c;那…

华为OD机试真题 Java 实现【组合出合法最小数】【2023Q1 200分】

一、题目描述 给一个数组&#xff0c;数组里面都是代表非负整数的字符串&#xff0c;将数组里所有的数值排列组合拼接起来组成一个数字&#xff0c;输出拼接成的最小的数字。 二、输入描述 一个数组&#xff0c;数组不为空&#xff0c;数组里面都是代表非负整数的字符串&…

解读智慧城市建设的关键角色:GIS技术的应用与优势

近年来&#xff0c;随着城市化进程的加快和信息技术的迅猛发展&#xff0c;智慧城市成为了城市发展的重要方向。而在智慧城市建设中&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术的应用正发挥着越来越重要的作用。GIS技术以其独特的地理空间分析能力&#xff0c;为…

龙芯2K1000实战开发-项目整体框架介绍

文章目录 概要整体架构技术名词解释技术细节小结概要 本项目主要以龙芯2k1000为CPU实现整个系统的管理,主要实现数据交换、时间同步和数据监控等功能。项目中龙芯作为一部分存在,考虑到项目涉密的原因,不能将整个项目的应用背景及项目整体方案做介绍,只能将龙芯过程开发做一…

NSSCTF之Web篇刷题记录(12)

NSSCTF之Web篇刷题记录[12] [NCTF 2018]签到题&#xff1a;[鹤城杯 2021]EasyP&#xff1a;[NSSCTF 2022 Spring Recruit]ezgame:[GXYCTF 2019]Ping Ping Ping&#xff1a;[SWPUCTF 2021 新生赛]finalrce&#xff1a;[NISACTF 2022]checkin&#xff1a; NSSCTF平台&#xff1a;…

程序员成长之路有哪些绝对不能踩的坑?

文章目录 一、你在编写代码时&#xff0c;会特别注意哪些流程&#xff1f;二、你在工作过程中踩过哪些坑&#xff1f;你是如何处理的呢&#xff1f;三、结合自身工作经验&#xff0c;分享一下程序员有哪些要避免的坑吧。总结 程序员编写高质量、可维护、安全且高效的代码&#…

【Python文本处理】基于运动路线记录GPX文件解析,心率、速度、时间、功率、踏频、海拔等参数的生成和更改

【Python文本处理】基于运动路线记录GPX文件解析&#xff0c;心率、速度、时间、功率、踏频、海拔等参数的生成和更改 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;time 心率&#xff1a;heartrate 功…

推荐5个非常强大的ChatGPT浏览器插件|你的生产力提高工具

近期&#xff0c;ChatGPT变得越来越热门&#xff0c;为此&#xff0c;许多浏览器插件也随之问世。这些基于ChatGPT的浏览器插件大大提高了ChatGPT的能力&#xff0c;使得我们能够更高效地在平时的上网、工作和学习中获得帮助&#xff0c;从而节省了大量时间。 今天我来给大家介…

168天,从外包转岗到阿里测开岗.....

本人毕业于某普通二本院校非计算机专业&#xff0c;跨专业入行测试&#xff0c;至今有近 5年工作经验。 第一份测试工作是在腾讯做了两年外包。总体感受就是 这份工作缺乏归属感&#xff0c;心里总有一种落差&#xff0c;进步空间不大&#xff0c; 接触不到核心技术&#xf…

分享以MM32SPIN0280单片机为主控洗衣机方案

洗衣机是利用电能产生机械作用来洗涤衣物的清洁电器&#xff0c;按驱动方法有3类&#xff0c;直接驱动&#xff0c;皮带驱动&#xff0c;波轮式驱动。 主变一体洗衣机方案以MM32SPIN0280为主控 MCU规格&#xff1a; -ArmCortex-M0内核&#xff0c;最高工作频率可达96MHz -128…