自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 GPIO通用输入输出口

在每个GPIO模块内,主要包含了寄存器和驱动器这些东西,寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,这样就可以完成输出电平和读取电平的功能了;这个寄存器的每一位对应一个引脚,其中输出寄存器写1(0)对应的引脚就会输出高(低)电平,GPIO在输入模式下可读取端口的高低电平或电压,用于读取按键输入,外接模块电平信号输入,ADC电压采集,模拟通信协议接收数据等。输出模式下可以控制端口输出高低电平,用以驱动LED,控制蜂鸣器,模拟通信协议输出时序等。可配置八种输入输出模式;

2024-07-12 23:48:38 162

原创 类继承-多继承虚继承

A里有个a,B C继承后各自有这个a,但是D继承B C就从B C各个继承了个a,一共俩a了。但是对象d真的需要两个a吗,如果a表示的是姓名或年龄显然一个人不需要两个姓名或者年龄;如果基类和派生类中的成员重名,在成员前面加类名和域名解析符就行了。所以我们可以在a前面加上类名和作用域解析符;B和C都继承于A,D继承B和C。编译器找到了两个不知道用哪个;这俩a地址不一样不是一个a;多继承的特殊情况:菱形继承。这样他俩就是一个变量了;

2024-07-06 02:58:19 142

原创 重载一元运算符

c++规定重载自增&自减运算符,如果重载函数有一个int形参,编译器处理后置表达式时将调用这个重载函数。然而你++(++g)不行,你让你重载函数返回对象的引用就可以了;显然你g1++是后来加,g2应该是g1之前的值而不是增后的值。函数的返回值不能是引用,成员函数的临时对象不能引用;main函数里的g1++不行但是++g1就行了;上面这是自增运算符的前置,我们再来个后置的;整数的话不可以后自增嵌套,前自增嵌套可以;现在我们重载一个++运算符。所以改一下后++的代码;

2024-07-05 23:00:47 495

原创 重载赋值运算符

拷贝构造与赋值运算不同,拷贝构造是指原来的对象不存在,用已存在的对象进行构造;赋值运算是指已存在了两个对象,把其中一个对象的成员变量的值赋值给另一个对象的成员变量。如果类的定义没有重载赋值函数,编译器就会提供一个默认的赋值函数,如果类中重载了赋值函数,编译器将不提供默认赋值函数。编译器提供的默认赋值函数是浅拷贝,如果对象中不存在堆区内存空间,默认赋值函数可以满足需求,否则要用深拷贝。对象的赋值运算是用一个已经存在了的对象给另一个已经存在的对象赋值。创建俩对象g1 g2给g1赋值不给g2赋值。

2024-07-05 22:13:59 421

原创 模板类与继承

生类如何构造基类:要在派生类BB构造函数的初始化列表中指明基类的构造函数。现在AA BB没有任何关系,如果把普通类作为基类,把模板类BB作为子类,继承AA。5模板类继承模板参数给出的基类(不能是模板类)AA没有合适的默认的构造函数。2普通类继承模板类的实例版本。1模板类继承普通类(常见)4模板类继承模板类。

2024-06-20 18:14:21 296

原创 类模板具体化

具体化程度高的类优先于具体化程度低的类,具体化的类优先于没有具体化的类。类模板具体化有两种:完全具体化和部分具体化。

2024-06-19 21:16:36 69

原创 嵌套使用模板类

Stack类用了堆区内存,所以说对于Stack用浅拷贝是不行的,得用深拷贝,所以Stack这种类一定要重写拷贝构造函数和赋值函数。在这个demo中没用到Stack的拷贝构造函数那就不管他了,但是应该为Stack类重写赋值函数,实现深拷贝。是把原数组中的元素复制到新数组,若复制的是cpp内置的数据类型,不存在任何问题,如果复制的是类,而且类使用了堆区内存,就存在浅拷贝的问题。now创建一个Stack容器,容器中的元素用Vector。也就是说,栈中的每个元素是一个数组。容器中的容器就是二维的容器。

2024-06-19 19:19:31 183

原创 类模板—模板类的示例—数组

原因是:string是类,里面有一个指向堆区内存的指针,所以不可以用memset()函数去初始化数组。但是如果把数组的数据类型改为字符串string,输出的就乱七八糟了。再给这个类加一个成员函数:如果数组太小,可以扩展;3.在类模板的代码中,不能修改非通用参数的值。数组不初始化不太好,办法肯定有,以后再说吧。函数模板可以有非通用类型参数,类模板也可以。定长数组:array容器(C++11标准)可变数组:vector容器。创建一个简单的变长数组容器。创建一个简单的定长数组容器。类模板的非通用类型参数。

2024-06-19 16:47:46 329

原创 模板类的实例—栈

接下来我们把这个普通类改为模板类;先写一个普通类,用具体的数据类型。把普通类改为模板类;

2024-06-18 19:44:54 236

原创 类模板的基本概念

回忆一下:使用函数模板的时候,可以让编译器根据实参自动推导出形参的数据类型,也可以手工显式指定数据类型,但是类模板不一样,不存在自动推导数据类型的说法,只能显式指定。现在模板类AA有两个通用的数据类型,用AA创建对象的时候在<>中要指明具体用哪两0种具体的数据类型,如果少了一种,编译会报错。意思是用模板类创建对象的时候,如果没有指定第二个参数,那就用string;类模板是通用类的描述,用任意类型(泛型)来描述类的定义。模板类不是类名,就只是类模板名,不是一种具体的数据类型。可以用new创建创建模板类对象;

2024-06-18 17:49:29 453

原创 函数模板的具体化

为了满足特殊的需求,可以提供一个具体化的函数,当编译器找到与函数调用匹配的具体化定义时,将使用该定义,不再寻找模板。————函数模板的具体化!函数模板优点是通用性,可以解决某个方面的普遍性问题,但是这个世界上的事情不是绝对的,有普遍的,就有绝对的。我要是只想用这个Swap函数交换超女类的排名,不交换其他成员,这样的话swap函数模板中现有的代码就不合适了;对于给定的函数名,可以有普通函数,函数模板和具体化的函数模板,以及他们的重载版本;普通函数优先于函数模板,所以编译器选择第一个,普通函数;

2024-06-18 03:24:33 403

原创 函数模板的注意事项

还是刚才的代码,你这么整没毛病,他是与函数模板的定义匹配的;4.使用函数模板时,如果是自动类型推导,不会发生隐式类型转换,如果显示指定了函数模板的数据类型,可以发生隐式类型转换;也就是说:如果显式指定了函数模板的数据类型,编译器就可以对实参进行隐式类型转换。以上很合理,可以对构造函数,和普通成员函数创建模板,但是虚函数不可以:如下。5.函数模板支持多个通用数据类型的参数;构造函数和普通的成员函数都可以用函数模板,但是你这个虚函数就不行了。3.使用函数模板时,推导的数据类型必须适应函数模板中的代码。

2024-06-18 02:45:30 404

原创 友元。。...

我们知道如果要访问类的私有成员变量,调用类的公有成员函数是唯一办法,而类的私有成员函数则无法访问。3.把男朋友的成员函数的函数体从类的定义中拿出来,放在定义超女类的后面。把main()函数声明为他的友元,main就可以访问他的私有成员了;在友元类的所有成员函数中,都可以访问另一个类的所有成员。在友元类某成员函数中,可以访问另一个类的所有成员。4.把男朋友类的成员函数声明为超女类的成员函数。在友元全局函数中可以访问另一个类的所有成员。2.把男朋友类的定义放在超女类之前;报错了,无法访问私有成员函数。

2024-06-17 22:09:40 499

原创 静态成员...

普通对象的成员变量需要先创建对象,然后才能访问,静态成员变量不一样,不创建对象也可以访问。这三个对象的姓名是不同的,因为姓名成员不是静态变量,而全部对象的年龄都是18,因为他们共享一个静态变量。在非静态成员函数和静态成员函数在一个类里边,访问比较方便,不用加 类名::直接访问就行。如果把类的成员声明为静态的,就可以把他与类的对象独立开来(静态成员不属于对象)。与全局变量和全局函数相比,类的静态成员还具备类的性质。在静态成员函数中只能访问静态成员不能访问非静态成员。静态成员包括静态成员变量和静态成员函数。

2024-06-17 21:23:04 470

原创 this指针

每个成员函数都有一个this指针,可以用它访问调用者对象的成员。(可以解决成员变量名与函数形参名相同的问题)如果类的成员函数中涉及多个对象,在这种情况下需要使用this指针。

2024-06-17 20:34:28 150

原创 初始化列表

初始化列表与赋值有本质区别,如果成员是类,使用初始化列表调用的是成员类的拷贝构造函数,而赋值是先创建成员类的对象(将调用成员类的普通构造函数)再赋值。如果没有采用初始化列表,对象的初始化和赋值是两步操作,如果采用了初始化列表,对象的初始化和赋值是一部操作。把构造函数的第三个形参boy改为引用就不会有第二行日志了。注意:如果成员是常量和引用必须用初始化列表。所以用初始化列表,效率更高。

2024-06-17 15:51:29 160

原创 重载下标运算符

重载运算符前后都加上const更普适;必须以成员函数形式重载。

2024-06-16 22:52:17 108

原创 函数模板的基本概念

函数模板用typename,类模板用class。函数模板是用任意数据类型来描述函数。

2024-06-06 15:25:33 85

原创 自动推导类型

初始化的右值可以是具体数值,也可以是表达式和函数的返回值等。auto声明的变量必须在定义的时候初始化。1.代替冗长复杂的变量声明;

2024-06-06 14:32:39 131

原创 重载左移运算符

左移运算符的重载只能用全局函数的方式,不能用成员函数。

2024-05-30 18:56:27 86

原创 Linux命令

cp拷贝,可以拷贝文件到哪哪哪,但是正常拷贝不了目录,加个参数 r cp -r a /b/ 就行了。touch:创建文件,如果你创建的文件存在的话,你就更新之前那个文件的时间。pwd:print working directory查看当前在哪个目录。-p :创建子目录的时候,父目录不存在的时候可以一起创建。mv 2024 2025相当于重命名2024为2025。ls:查看当前这个目录的文件 list files。cd:做切换的,change directory。rm -rf 带目录强制删除。

2024-05-28 10:14:04 132

原创 多态的基本概念

基类指针可以指向派生类对象,但是通过基类指针真能调用基类的成员函数,访问基类的成员变量,不能调用派生类的成员函数,也不能访问访问派生类的成员变量。测试证明:有了虚函数,基类指针指向基类对象时就使用基类的成员函数和数据,指向派生类时就使用派生类的成员函数和数据。如果给派生类的show()函数增加一个参数,编译运行没问题,但是日志显示的是基类的show()函数,不是派生类的。把派生类的show()函数里面的参数删掉,就正常调用派生类的show()函数了;2.在派生类中重新定义虚函数时,函数特征要相同;

2024-05-20 22:28:16 285

原创 《继承方式》

1.在派生类中可以通过基类的公有成员函数间接访问基类的私有成员。通过基类的公有成员函数间接访问基类的私有成员。但只能改public和protected的,private改不了。2.使用using关键字可以改变基类成员在派生类中的访问权限。通过基类的公有成员函数间接访问基类的私有成员。报错:B继承A,A的private访问不了。报错:m_b m_c 访问不了;现在就m_b可以访问。

2024-05-15 21:20:25 197

原创 继承的基本概念

语法:class 派生类名:[继承方式]基类名。

2024-05-15 20:46:59 69

原创 拷贝构造函数

用一个已经存在的对象创建新的对象,不会调用普通的构造函数,而是调用拷贝构造函数,如果类中没有定义拷贝构造函数,编译器将提供一个拷贝构造函数,它的功能是把已存在对象的成员变量赋值给新对象的成员变量。5.函数以值的方式返回对象时,可能还会调用拷贝构造函数(vs会调用,linux不会bacause g++编译器做了优化)7.如果类中重载了拷贝函数却没有定义默认的拷贝构造函数,编译器也会提供默认的拷贝构造函数。4.以值传递的方式调用函数时,如果实参为对象,会调用拷贝构造函数。类名 新对象名(已存在对象名);

2024-05-15 20:24:44 217

原创 根据数字判断月份

在界面上输入数字的月份(1-12),输出对应月份的英文单词的全称,如果输入的数字不合法,给。1)用字符串数组(C风格和C++风格)实现。

2024-04-07 20:34:16 211

原创 妃子、宫女和嬷嬷

宫女:1) 年龄18-30岁;2)身高160-165cm;3)身材火辣或者普通;嬷嬷:1)年龄35-40岁;2)身高155-165cm;3)身材普通或者飞机场;妃子:1)年龄18-25岁;2)身高165-178cm;在界面上输入超女数据后,按下列要求选出妃子、宫女和嬷嬷。3)用逻辑表达式组合判断条件,不要用嵌套if语句。2)先输入超女全部的数据项,然后才进行选秀;1)超女数据用结构体表示;

2024-04-07 20:33:33 160

原创 对象和类—构造函数和析构函数

现在有俩构造函数了,那创建对象的时候,该调用哪个函数呢?创建对象的时候,如果对象名后面什么都不写,就调用没有参数的那个构造函数。如果想调用有一个参数的这个该站属,就需要在对象名后面写括号和一个实参。这样就调用了构造函数,成员变量已被初始化,没有乱码了。5.销毁对象前之会自动调用一次,但是可以手工调用。5.创建对象时会自动调用一次,不能手工调用。4.可以有参数,可以重载,可以有默认参数。:在创建对象时,自动进行初始化工作。:在销毁函数前,自动完成清理工作。3.没有返回,也不写void。

2024-04-07 17:14:49 877

原创 枚举....

这个cc就是一个普通整型变量,具备普通变量全部的特征,可以用于表达式,可以取地址,可以作为实参传递给函数,就是取值范围受到了限制只能是4这个单词。cc是整数可以用于swtich语句的表达式中,枚举量是整型常量,所以可以用于case的分支中。3.可以显示的设置枚举量的值(必须是整数),指定的值也行,不一定要从小到大或者从大到小。enum 枚举名{枚举量1,枚举量2,枚举量3,......,枚举量n};1)让colors成了一种新的枚举类型的名称,可以用它创建枚举变量;2.枚举的作用域与变量的作用域相同。

2024-04-01 21:57:18 584

原创 简单使用类

1.类的成员函数可以直接访问该类的成员函数,成员函数也可以递归。2.类的成员可以是任意数据类型(类中枚举)。类中枚举很方便常用。类里面写递归比较方便——不用传参数,可以用成员变量;

2024-04-01 21:28:01 194

原创 类的访问权限

age这个成员是类私有的,但是你setvalue和show函数都是类的成员函数属于类的内部,是可以访问的,如果在外部访问他(age),比如在main函数中,就会报错。在类的外部(定义类的代码之外),只能访问public成员,不能访问private和protected的成员;在类的内部(类的成员函数中),无论成员被声明为public还是private都可以访问;结构体的成员缺省为public,类的成员缺省为private。对类来说如果生么权限都不设置,那么全部成员的权限都是私有的;

2024-04-01 21:08:43 164

原创 从结构体到类

如上是从函数的封装到结构体的封装,其实就是在结构体中加入了成员函数,成员函数的特点是可以直接访问结构体成员变量。结构体成员函数还有一个特点:可以直接在成员函数中访问成员变量,这样这个成员show函数就用不着传参数了。正常用实现定义一个结构体,初始化成员信息,再输出成员信息,可以如下这样实现。再把setvalue函数也改为结构体的成员函数。在类中只用写这个函数的声明就行;在函数名前面加上类名还有俩冒号。如下这个玩意就完完全全是类了。

2024-04-01 20:53:23 145

原创 结构体中的指针

虽然又动态申请了int[100]但是我们的sizeof还是不变,所以对结构体用sizeof运算可能没有意义。string可以理解成一个含有指针的结构体,所以我们也不能随便memset它。1:如果程序中继续对指针creditcard进行操作,就是操作空指针。最后的结果是堆中的内存越来越少,整个系统越来越慢,程序也会崩溃。C++的字符串string中有一个指向是动态分配内存的地址。2:指针指向的那块内存没有被释放,产生内存泄漏。在动态分配内后前就不行了,只能逐个成员的处理。乱码了,指针不知道飞哪里去了。

2024-03-28 22:16:39 263

原创 结构体嵌入数组和结构体

把二维或者多维数组放在结构体中,作为结构体的一个成员调用函数的时候,把结构体的地址传给函数,函数的形参。,这样可以绕过二维数组和多维数组传递指针的问题。(但是你得把你要嵌套的结构体放前面)挨个儿赋值就行,注意归属关系。二:在结构体中嵌入其他结构体。一:在结构体中嵌入数组。

2024-03-28 21:18:13 377

原创 结构体数组

声明结构体数组的语法:struct 结构体类型 数组名[数组长度];(C++中struct关键字可以不写)结构体可以被定义成数组变量,本质上与其他类型的数组变量没有区别。使用结构体数组可以用数组表示法,也可以用指针表示法。初始化结构体数组,要结合初始化。

2024-03-27 21:56:55 151

原创 结构体指针

C++中,会用不同类型的指针存放不同类型的变量地址,这一规则也适用于结构体。在func()函数中,转进来的是实参的地址,那就可以通过结构体指针来修改实参的值。如果要把结构体传给函数,实参取结构体变量的地址,函数的形参用结构体的指针。如果不希望在函数中修改结构体变量的值,可以对形参加 const 约束。如果不想让实参在函数中被修改,可以把函数形参加上const约束。用结构体指针访问结构体:指针名->成员变量名。注意:与数组不一样,结构体变量名没有被解释为地址。运行结果如下:(实参在函数中被修改了)

2024-03-27 21:33:19 499

原创 结构体基本概念

貌似应该是21+4+8+1+1=35,实际上运行出48,这是由于内存对齐规则。2.结构体成员可以用C++的类(如string),但是不提倡。如果想给每个成员赋初始值,可以在值填在花括号里(对应着填)。memset() 和 bzero()都可以用来清空结构体。初始化可以大括号里 放个0或者不放,但是一定要初始化。用sizeof运算符可以得到整个结构体占用内存的大小。但是结构体占的内存不一定等于全部成员占用内存之和。3.C++中,结构体成员可以有函数,但是不提倡。但是在C++中如下指令可以修改内存对齐规则。

2024-03-27 20:35:14 148

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除