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

C++类和对象补充

目录

前言:

1. 构造函数->初始化列表

1.1 初始化列表出现原因

1.2 初始化列表写法

2. explicit关键字

2.1 explict的出现

2.2 explict的写法

3. static成员

4. 友元

4.1 友元函数

4.2 友元类 

5. 内部类和匿名对象

5.1 内部类

5.2 匿名对象


前言:

        本篇讲解的内容是类和对象的补充知识,也就是类和对象当中平时不太注意,但是有比较重要的知识。其中包括构造函数中的初始化列表、static成员、友元、内部类、匿名对象,以及部分小知识。如果小伙伴们有需要请向下查看咯。

1. 构造函数->初始化列表

1.1 初始化列表出现原因

        朋友们,还记得我上篇讲的,当我们在实例化一个对象的时候,编辑器会干嘛?会调用类里的构造函数,对类里面的成员变量作合适的初始化。如下:

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

        但是朋友们,有没有想过一个问题?那就是虽然我们在实例化的时候传入了一个参数,但是那真的算是初始化吗?可能有的小伙伴没有理解我的话。那我换一个说法,我们传入一个值用于初始化,并且将这个值赋值给了一个变量,那么这一步算是初始化吗?

        答案是否,这一个过程并不能说是初始化,我可以举一个例子:

    int a = 0;        //初始化a为0

    int b;              //创建了一个变量b
    b = 0;             //赋值b为0

         大家可以看出这两者的区别了吗?我相信是能的,那么再回到我们的构造函数,这个时候我们再看它,他是初始化还是赋值操作?相信大家心里有数了吧。

        不过话又说回来,这个初始化和赋值有什么影响吗?这么看起来好像没有区别啊?确实,如果是这种类型的变量赋值和直接初始化没有区别,但是大家可能忘了某些东西:引用、const成员变量。想到了吗?

    int& c;                        //引用不初始化
    const int d;                //  const成员变量不初始化      
    d = 10;                      //const成员变量重新赋值

         这几个写法很明显是错误的,相信大家也能够分辨出来,那么我们将这两个类型写在类里,此时我们的写法还正确吗?肯定是错误的。

        所以,C++祖师爷基于这个点,为我们的构造函数多添加了一个功能——初始化列表。

1.2 初始化列表写法

        先看一下代码是如何写的:

class A
{
public:A(int a)			:_a(a)			//初始化列表{}
private:int _a;
};
class B
{
public:B(int a, int ref):_aobj(a)		//初始化列表, _ref(ref), _n(10){}
private:A _aobj; // 没有默认构造函数int& _ref; // 引用const int _n; // const
};

        大家看看我定义的两个类,有没有发现它里面的构造函数多了个东西?那就是以冒号开始,用逗号分隔每一个变量,每个变量加上括号和初始值。

        用上述的B类构造函数为例子:

:_aobj(a)       
, _ref(ref)
 , _n(10)

         这就是初始化列表写法,当然,如果我们初始化有特殊的需求,还是可以将功能写在初始化列表下方的花括号中,例如条件判断、申请堆上的空间之类的。

        编辑器有一个对于初始化列表的规定,那就是不管我们写不写,它都会自己去运行一遍,不过它却不会对这些变量做任何的处理,只有我们写了,他才会为其赋初值。

        还有一点需要我们注意,请先看下方代码,并计算_a1和_a2的初始值。

class A
{
public:A(int a):_a1(a), _a2(_a1){}void Print() {cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};int main() {A aa(1);aa.Print();
}

选项: 

A. 输出1 1
B.程序崩溃
C.编译不通过
D.输出1 随机值

         答案是D,与大家计算的是否有出入了?相信多数朋友会选择a吧?因为我就是其中之一。

        其实初始化列表的初始化顺序不是我们眼睛看到的那样,它的初始化顺序是变量定义的顺序,看下代码:

private:int _a2;int _a1;

        也就是说,_a2先用_a1的初始值也就是随机值赋值了,然后_a1再通过1赋值,这也就造成了我们之前产生的小bug。

2. explicit关键字

2.1 explict的出现

        在讲解这个关键字的之前,我想问一个问题,大家知道下面的两种实例化对象的方式有什么不同吗?(不是说写法)。

Date d1(2023,2,17);

Date d2 = {2023,2,17};

         这样问估计有些难为人,我就直接讲了,第一种会直接用这些初始值通过构造函数实例化

        但是第二种不同,第二种通过这些初始值,调用构造函数实例化之后,然后通过赋值的方式将其转换给d2。大家看出区别了吗?也就是说第一种实例化只有构造函数参与,但是第二种不仅有构造函数,还有拷贝构造参与。不过对于现在的编辑器来说已经被优化了,二者都只有构造函数参与,如果按照刚出现的那段时间,用第二种在构造一个对象的时候产生两个变量大小的空间,这务必会影响我们程序运行的效率。

        那我问大家,为什么会出现这个过程呢?先看下方的代码:

    int a = 10;
    double b = (double)a;

         问:我们将a强制类型转换成double类型,int a是否还存在。

        答案是当然存在,强制类型转换只会新开辟一个临时空间存储,然后赋值给b,其中a的参与只有提供10这个数的价值。通过等效的理解方式,大家再去看上面的Date d2 = {2023,2,17};是不是瞬间就明白了?只不过该操作是隐式类型转换

        explict的出现就是为了禁止这种强制类型转换的。

2.2 explict的写法

class Date
{
public:explicit Date(int year):_year(year){}Date& operator=(const Date& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}
private:int _year;int _month;int _day;
};
void Test()
{Date d1(2022);d1 = 2023;            //错误}

        大家可以看到,如果我们不添加explict,d1 = 2023这种写法是正确的,但是大家可以赋值这段代码进入你的编辑器看一看,这个操作是否还正确?

        所以explict的功能是:用explicit修饰构造函数,将会禁止构造函数的隐式转换。

3. static成员

        对于static关键字,想必大家还是很了解的,但是当他出现在类里面还清楚吗?

        我们都知道static描述的变量,这个变量的生命周期会到程序结束才会停止,而不是局限于函数结束就被销毁。这个特性static也延续到类当中,当用static去修饰类里面的变量,那么这个变量的生命周期就被提升,并且它并不单独属于某个实例化的类对象,而是属于整个类。

        大伙看到这估计有些疑问,他既然写在了类里面,又不属于这个类的对象,那么它在哪?答案是它被存在了静态区。也就是计算类的大小也不会将他算入其中。

class Date
{
public:static int a;
private:int _year;int _month;int _day;
};int main()
{Date d1;cout << sizeof(d1) << endl;return 0;
}

         正常来说,这个类的大小应该是16对吧,因为又4个整型变量嘛,但是其中有一个变量是static修饰的,所以它的大小不计入其中。

        因为这个static修饰的变量不属于某一个变量,所以说,没有任何一个对象想能对其进行初始化,只能有一个操作,那就是类外定义。

int Date::a = 0;

        至于为什么要这样做?想一想,要是每一个对象都能够对static初始化,那么static修饰这个变量有什么意义呢?

        并且static不只是可以修饰变量,还可以修饰成员函数,将这个成员函数变为静态成员函数。

以下几个特性需要大家知道:

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

         知道了这些特点,下面两个问题相信大家也能够回答了。

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

4. 友元

        友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
        友元分为:友元函数和友元类

4.1 友元函数

        一般来说友元用到的场景不会太多,但是有一个东西如果不用友元那么它的操作方式会变得十分奇怪,那就是重定义<<和>>这两个操作符。

class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}ostream& operator<<(ostream& _cout){_cout << _year << "-" << _month << "-" << _day << endl;return _cout;}
private:int _year;int _month;int _day;
};int main()
{Date d1(1, 2, 3);d1 << cout;//cout << d1;   //错误return 0;
}

        d1 << cout; -> d1.operator<<(&d1, cout); 不符合常规调用,因为成员函数第一个参数一定是隐藏的this,所以d1必须放在<<的左侧。

        还记得我上一篇讲的吗?因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator<<重载成全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。operator>>同理。

        这个时候友元函数的出现就显得十分重要了:

class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Date(int year = 1900, int month = 1, int day = 1): _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;
}

        可以看到我们的友元函数的写法就是将函数定义在类外面,然后在类里面写下声明并在前面添加上friend关键字。声明的位置可以是任意位置,但是我们习惯将其写在类最上方,而且友元函数突破了public、protected、private的限制。也就是友元函数能够直接访问类里面的私有成员。

friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);

 特性:

友元函数可访问类的私有和保护成员,但不是类的成员函数
友元函数不能用const修饰
友元函数可以在类定义的任何地方声明,不受类访问限定符限制
一个函数可以是多个类的友元函数
友元函数的调用与普通函数的调用原理相同

4.2 友元类 

特性:

1. 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
2. 友元关系是单向的,不具有交换性。比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
3. 友元关系不能传递,如果C是B的友元, B是A的友元,则不能说明C时A的友元。
4. 友元关系不能继承,在继承位置再给大家详细介绍。

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;
};

5. 内部类和匿名对象

5.1 内部类

概念:

1. 如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,
它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
2. 注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

特性:

1. 内部类可以定义在外部类的public、protected、private都是可以的。
2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
3. sizeof(外部类)=外部类,和内部类没有任何关系。

class A
{
private:static int k;int h;
public:class B // B天生就是A的友元{public:void foo(const A& a){cout << k << endl;//OKcout << a.h << endl;//OK}};
};
int A::k = 1;
int main()
{A::B b;b.foo(A());return 0;
}

5.2 匿名对象

class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
class Solution {
public:int Sum_Solution(int n) {return n;}
};

int main()
{
    A aa1;
    // 不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义
    //A aa1();
    // 但是我们可以这么定义匿名对象,匿名对象的特点不用取名字,
    // 但是他的生命周期只有这一行,我们可以看到下一行他就会自动调用析构函数
    A();
    A aa2(2);
    // 匿名对象在这样场景下就很好用,当然还有一些其他使用场景,这个我们以后遇到了再说
    Solution().Sum_Solution(10);
    return 0;
}


         以上就是我对类于对象的全部补充啦,还请大家多多支持咯!

相关文章:

C++类和对象补充

目录 前言&#xff1a; 1. 构造函数->初始化列表 1.1 初始化列表出现原因 1.2 初始化列表写法 2. explicit关键字 2.1 explict的出现 2.2 explict的写法 3. static成员 4. 友元 4.1 友元函数 4.2 友元类 5. 内部类和匿名对象 5.1 内部类 5.2 匿名对象 前言&a…...

08 SpringCloud 微服务网关Gateway组件

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f; 如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去用。 这样的架构&#xff0c;会存…...

极验3代 加密分析

目标链接 aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s接口分析 极验参数重要信息 gt和challenge&#xff1b;gt是固定的&#xff0c;但是challenge每次请求会产生不同的&#xff0c;这里的请求的并没有什么加密参数。 下一个请求 gettype.php&#xff0c…...

python 数据分析可视化实战 超全 附完整代码数据

代码数据&#xff1a;https://download.csdn.net/download/qq_38735017/873799141.1 数据预处理1.1.1 异常值检测①将支付时间转为标准时间的过程中发生错误&#xff0c;经排查错误数据为‘2017/2/29’,后将其修改为‘2017/2/27’。②经检测发现部分订单应付金额与实付金额都为…...

有趣的HTML实例(十三) 咖啡选择(css+js)

一个人追求目标的路途是孤单的&#xff0c;一个人独品辛酸的时候是寂寥的&#xff0c;一个人马不停蹄的追赶着&#xff0c;狂奔着&#xff0c;相信前方是一片光明&#xff0c;我从不放弃希望&#xff0c;就像我对生活的信念&#xff0c;没有人可以动摇。 ——《北京青年》 目录…...

【力扣-LeetCode】1139. 最大的以 1 为边界的正方形 C++题解

1139. 最大的以 1 为边界的正方形难度中等137收藏分享切换为英文接收动态反馈给你一个由若干 0 和 1 组成的二维网格 grid&#xff0c;请你找出边界全部由 1 组成的最大 正方形 子网格&#xff0c;并返回该子网格中的元素数量。如果不存在&#xff0c;则返回 0。示例 1&#xf…...

【JavaGuide面试总结】Redis篇·下

【JavaGuide面试总结】Redis篇下1.如何使用 Redis 事务&#xff1f;2.如何解决 Redis 事务的缺陷&#xff1f;3.说说Redis bigkey吧4.大量 key 集中过期问题怎么解决的5.如何保证缓存和数据库数据的一致性&#xff1f;6.缓存穿透有哪些解决办法&#xff1f;7.缓存击穿有哪些解决…...

ForkJoinPool原理

1、概述 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架。ForkJoinPool是Java中提供了一个线程池&#xff0c;特点是用来执行分治任务。主题思想是将大任务分解为小任务&#xff0c;然后继续将小任务分解&#xff0c;直至能够直接解决为止&#xff0c;然后再依次将任…...

02 python基本语法和数据类型

基本语法 python脚本可以在python交互式shell或者代码编辑器中编写与运行。python文件的扩展名一般为.py python使用缩进来区分不同的代码块,此特性有利于提高代码可读性。 下面是一个简单的python条件语句代码: 小明=矮穷错 小红=白富美 小华=高富帅 小李=程序员某人 = &quo…...

【办公类-16-09】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)

样例展示&#xff1a;跳过节日的运动场地循环排序表&#xff08;8个班级8组内容 下学期一共20周&#xff09;背景需求&#xff1a;上学期做过一次大班运动场地安排&#xff0c;跳过节日。2023.2下学期运动场地排班&#xff08;跳过节日&#xff09;又来了。一、场地器械微调二、…...

全网多种方法分析解决HTTP Status 404资源未找到的错误,TCP的3次握手,dns域名解析,发起http请求以及cookie和session的区别

文章目录1. 文章引言2. 简述URL3. http完整请求3.1 DNS域名解析3.2 TCP的3次握手3.3 发起http请求3.4 浏览器解析html代码3.5 浏览器对页面进行渲染呈现给用户4. 解决404错误的方法5. 补充知识点5.1 cookie和session的区别5.2 ChatGPT的介绍1. 文章引言 正赶上最近ChatGPT很火…...

Django图书商场购物系统python毕业设计项目推荐

mysql数据库进行开发&#xff0c;实现了首页、个人中心、用户管理、卖家管理、图书类型管理、图书信息管理、订单管理、系统管理等内容进行管理&#xff0c;本系统具有良好的兼容性和适应性&#xff0c;为用户提供更多的网上图书商城信息&#xff0c;也提供了良好的平台&#x…...

基于模型预测控制(MPC)的悬架系统仿真分析

目录 前言 1.悬架系统 2.基于MPC的悬架系统仿真分析 2.1 simulink模型 2.2仿真结果 2.3 结论 3 总结 前言 模型预测控制是无人驾驶中较为热门的控制算法&#xff0c;但是对于悬架等这类系统的控制同样适用。 我们知道模型预测控制主要可以划分为三个部分&#xff1a; …...

Word处理控件Aspose.Words功能演示:使用 Java 拆分 MS Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word处理文件…...

图扑数字孪生智慧机场,助推民航“四型机场“建设

前言 民航局印发的《智慧民航建设路线图》文件中&#xff0c;明确提出智慧机场是智慧民航的四个核心抓手之一。并从机场全域协同运行、作业与服务智能化、智慧建造与运维方面&#xff0c;为智慧机场的发展绘制了清晰的蓝图。 效果展示 图扑软件应用自主研发核心产品 HT for …...

内网安装管家婆软件如何实现外网访问?内网穿透的几种方案教程

管家婆软件从网络架构上分两种版本&#xff1a;web&#xff08;浏览器http端口&#xff09;访问的版本和客户端&#xff08;211固定端口sqlserver数据库&#xff09;访问的版本。公司库管经常用仓库登录管家婆&#xff0c;一旦需要在公司外部登陆访问管家婆客户端&#xff0c;就…...

CCNP350-401学习笔记(1-50题)

1、Which function does a fabric edge node perform in an SD-Access deployment?A. Connects endpoints to the fabric and forwards their traffic. B. Encapsulates end-user data traffic into LISP. C. Connects the SD-Access fabric to another fabric or external La…...

基于微信小程序的新冠肺炎服务预约小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…...

网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)

在K8s平台部署项目流程 在K8s平台部署Java网站项目 制作镜像流程 第一步&#xff1a;制作镜像 使用镜像仓库&#xff08;私有仓库、公共仓库&#xff09;&#xff1a; 1、配置可信任&#xff08;如果仓库是HTTPS访问不用配置&#xff09; # vi /etc/docker/daemon.json { "…...

网络原理 (1)

网络原理 文章目录1. 前言&#xff1a; 2. 应用层2.1 XML2.2 json2.3 protobuffer3. 传输层3.1 UDP3.1 TCP4. TCP 内部的工作机制 &#xff08;重点&#xff09;1. 确认应答 2.超时重传3. 连接管理3.1 建立联系 &#xff1a;三次握手3.2 断开连接 : 四次挥手4. 滑动窗口5. 流量…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...