![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
interview
酸菜鱼的鱼
Linux rtos 驱动应用开发 本博客主要用于工作学习的总结和备份,欢迎大家留言评论交流,谢谢
展开
-
raspberry pi cm3+的i2c使用的问题调试
本文是在树莓派上面使用i2c时候,运行时间太长就会随机出现错误:bcm2835 3f205000.i2c: Got unexpected interrupt (from firmware?) 调试解决方法。之前有介绍到cm3的i2c:https://blog.csdn.net/u010299133/article/details/107006090?ops_request_misc=%257B%2522request%255Fid%2522%253A%25221601207611191952466..原创 2020-09-27 19:57:02 · 734 阅读 · 0 评论 -
泛型编程--c++中的模板特化
模板的特化:函数模板的特化和类模板的特化当函数模板或者类模板需要对一些特殊的类型做特殊处理的时候,需要用到c++中模板的特化机制。比如如下代码,模板ret_max中两个参数t1和t2,可以是多个类型,int,double,。如果需要对特殊的类型如下面代码的char *类型,做特殊的处理,就是里面实现的功能不一样。就可以使用如下的方法。#if 1template <class...原创 2020-02-09 23:02:16 · 190 阅读 · 0 评论 -
数据结构中的排序--归并(merge)排序
以下的图片来自网络资料:https://www.jianshu.com/p/33cffa1ce613归并排序的思路图示:合并两个有序数列的流程思路:C语言的实现代码:#include "stdafx.h"#include <iostream>using namespace std;void print(int data[], int n){ for...转载 2020-02-06 15:29:01 · 679 阅读 · 0 评论 -
数据结构中的排序--堆(heap)排序
堆排序的相关理论和概念可以参考网络上的资源。堆排序涉及到的主要是完全二叉树,以及堆的理解。堆在排序中的作用是在一个完全二叉树中选出待排序数据中的最大或者最小的值,并将这个值放置于根节点。每次只需要将根节点的值取出,放到已排好序的数列中。剩下的数据继续组成一个堆,再取出根节点放到已排好序的数列后面,一直到堆中的数据取完为止。这里面比较重要的就是堆的构建,涉及到左右子节点以及递归的使用。...原创 2020-02-05 16:37:32 · 339 阅读 · 0 评论 -
数据结构中的排序--选择(select)排序
选择排序和冒泡排序不管是在算法的思路上还是代码的实现上都差别不大。不同在于,选择排序可以算作是冒泡排序的一种改进,这种改进主要体现在数据的移动次数上面。冒泡排序每次比较后,如果后面的元素有和比当前的元素大或者小,就会交换位置。而选择排序,比较后是记录当前的最小值得位置,一趟比较完成后才做交换。这样的话,就减少了交换的次数。选择排序的代码实现如下:#include "stdafx.h"#...原创 2020-02-04 10:17:42 · 614 阅读 · 0 评论 -
数据结构中的排序--快速排序
快速排序可以先参考:https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fr=aladdin#include "stdafx.h"#include <iostream>using namespace std;void print(int dat...原创 2020-02-03 11:51:13 · 375 阅读 · 1 评论 -
数据结构中的排序--冒泡(bubble)排序
冒泡排序的思路:以升序为例,将数列中的第一个数拿出来,依次后后面的比较,如果比后面的数大,那么久交换,直到比较到最后一个,当这一趟比较结束后,第一个数就是最小的。然后再取第二个数,同样的依次和后面的数比较,比较结束后,这个数据就是第二小的,后面的就是依次类推。C语言中两个for循环即可实现。#include "stdafx.h"#include <iostream>...原创 2020-02-02 11:28:33 · 336 阅读 · 0 评论 -
数据结构中的排序--希尔(shell)排序
shell排序是插入排序的优化,当需要排序的数据量比较大的时候,比较有帮助。shell排序是一种分组排序,所以重点不同在于分组。如分组的大小初始值为长度的一般,每次分组的大小为之前的一般,直到为1.原始数列 5 3 7 4 3 9 6 2 10 4 3 7 1 长度13第一次分组6 5 6 1...原创 2020-02-01 22:33:05 · 375 阅读 · 0 评论 -
c++实现一个二叉排序树以及树的递归遍历的实现
二叉排序树的理论介绍:https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%8E%92%E5%BA%8F%E6%A0%91/10905079?fr=aladdin一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3...原创 2020-01-16 20:44:30 · 477 阅读 · 0 评论 -
c++中基于两个栈实现队列的操作
思路:由于队列的先进先出的特性,使用栈的先进后出的特性。可以使用两个栈,其中一个栈实现入队,另一个栈实现出队的操作。定义一个数据节点的类:class data_node{public: data_node() :data(0), next(NULL){}//default constructer function data_node(int value) :data(val...原创 2020-01-12 15:27:15 · 548 阅读 · 0 评论 -
C++实现栈的操作(push和pop)
栈的组织形式:如上图所示:栈也是有多个数据节点组成的,每个节点包含有数据域和指向下一个节点的指针域。并且每次的push、pop和判空都是操作的栈顶指针top。栈中每个数据节点的定义:class data_node{public: data_node() :data(0), next(NULL){}//default constructer function data_nod...原创 2020-01-10 22:46:58 · 16717 阅读 · 0 评论 -
c语言实现队列的先进先出操作
队列的特点是先进先出,有一个队列头和一个队列尾。如下图示:整个队列含有一个队列头指针front和一个队列尾指针rear,并且队列中每个节点中包含一个数据域和一个指向下一个节点的指针域。定义一个节点:typedef struct _node{ int data; struct _node *next;}node;定义队列结构体:typedef struct { nod...原创 2020-01-07 22:24:45 · 6360 阅读 · 0 评论 -
C语言循环单链表实现约瑟夫(JosephUS)问题
1.C语言单链表实现1.1循环链表的创建主要思路是:创建头结点--赋值--创建中间节点--赋值---创建尾结点--赋值。本次采用的循环链表中的数字都是顺序赋值。node *create_josephus(int n){ node *head = NULL, *p=NULL, *new_node=NULL; int i; if (0 != n){ head = (node ...原创 2019-12-09 22:59:36 · 1643 阅读 · 0 评论 -
c++中虚函数表的理解
虚函数表是一个类的虚函数的地址表,解决了继承和覆盖的问题,其内容反映类中真实的函数。在一个含有虚函数的类的实例中,这个表存在实例的内存中,编译器在编译的时候都会讲这个表置于实例内存的最前面。一般来说,实例的地址就是虚函数表的地址。也就是说可以通过实例的地址获取到这个表的首地址。定义如下的基类:class base{public: base(int x) :a(x){ cout &...原创 2019-11-24 20:26:01 · 317 阅读 · 0 评论 -
c++的体现多态的一个简单应用
本代码的实现的功能是计算正方形和矩形的面积,所以先建立了一个抽象的基类base_sharp,主要是用于声明面积的打印方法和面积的计算方法。然后声明建立了矩形类rectangle和正方形类square,都对基类做了继承,并且分别对基类中的纯虚函数做了实现。// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。//// test.cpp : 定义控制台应用程...原创 2019-11-23 22:01:54 · 420 阅读 · 0 评论 -
c++抽象类中纯虚函数的理解
纯虚函数:纯虚函数就在基类中只是定义并不实现,需要在派生类中继承并且实现。纯虚函数的意义就是将派生类的共同特性提取出来。虚函数和纯虚函数的区别:虚函数在基类中有实现,并且派生类无需一定要继承,派生类可以继承并且重写,实现多态。抽象类:一个类中含有一个或者多个纯虚函数,那么这个类就是抽象类。不能实例化对象,只能定义指针,指向派生类以实现多态。代码示例:// ConsoleAppli...原创 2019-11-21 22:15:35 · 1366 阅读 · 0 评论 -
c++中多重继承二义性产生以及二义性的消除方法
实际的业务场景中,一些事物会有多个属性。由此c++引入了,多重继承的概念,也就是允许一个派生类指定多个基类,这样就被叫做多重继承。如下代码:#include "stdafx.h"#include <iostream>#pragma warning(disable:4996)#include <string>using namespace std;cl...原创 2019-11-20 23:07:09 · 1605 阅读 · 0 评论 -
c++中虚函数的理解
派生类实例化一个对象的时候,先调用基类的构造函数,然后再调用派生类的构造函数。指向派生类的基类指针,在调用基类的虚函数时需注意,派生类是否有对基类的虚函数覆写操作,如果有,则会执行派生类覆写的代码,实现多态的效果。代码如下:#include "stdafx.h"#include <iostream>#pragma warning(disable:4996)#inclu...原创 2019-11-19 22:51:26 · 278 阅读 · 0 评论 -
c++中多态的理解
多态的定义:同一种操作作用于不同的对象,有不同的解释,产生不同的结果。c++中的多态分为两类:1.编译时的多态:类中非虚成员的参数和返回值,确定不同的操作。2.运行时的多态:到程序的运行的时候,才根据实际情况决定实现何种操作。派生类继承并覆写基类的虚函数成员。以下是运行时多态的一个简单示例:#include "stdafx.h"#include <iostream&g...原创 2019-11-18 21:50:13 · 944 阅读 · 0 评论 -
c++中私有继承和组合的关系
私有继承派生类会获得基类的一份备份,同时获得基类的public,protected接口的权利,以及重写基类虚函数的能力。组合没有这些能力。私有继承和组合都能够表示基类和派生类的有一个的关系,即:派生类有一个基类。下面代码是私有继承和组合的一些实现上的区别。代码实例// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。//// test...原创 2019-11-17 22:39:36 · 435 阅读 · 0 评论 -
c++实现字符串的加法+和赋值=运算符的重载
c++中的operator特性可以帮助我们实现一些类特有的功能,帮助我们在对字符串操作中实现运算符的重载。代码如下// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。//// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#pragma war...原创 2019-11-17 16:15:20 · 3473 阅读 · 0 评论 -
c++中的重载和覆写的区别
重载:1.重载方法名必须相同。2.参数类型和数量可以不同3.返回值的类型可以不同4.c++中的重载时在编译器编译阶段完成的,不属于面向对象的编程覆写:1.是指在派生类中重写基类的虚函数。2.函数名,参数类型和参数数目必须相同3.只能是重写基类的虚函数或者抽象函数。4.覆写是面向对象编程的重要特性,是在程序运行的时候决定的。...原创 2019-11-16 21:44:49 · 395 阅读 · 0 评论 -
c++中统计类实例化的次数(static 的使用以及临时对象的理解)
目录代码实现:执行结果结果分析代码实现:// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。//// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>using namespa...原创 2019-11-15 22:29:48 · 1285 阅读 · 0 评论 -
c++中析构函数,构造函数和复制构造函数的理解
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>//#pragma warning(disable:4996)using namespace std;class test{public: test() { cout <&...原创 2019-11-13 22:04:43 · 201 阅读 · 0 评论 -
c++中临时对象的理解
目录代码源码:代码的执行结果:下面对输出结果逐一分析:代码源码:// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>//#pragma warning(disable:4996)using namespace st...原创 2019-11-13 21:27:36 · 334 阅读 · 0 评论 -
c++中类String的构造函数,赋值函数和复制函数的实现
代码如下:// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>#pragma warning(disable:4996)using namespace std;class String{private: char *m_Stri...原创 2019-11-13 09:32:14 · 1215 阅读 · 0 评论 -
c++中调用基类的构造函数对基类的私有成员初始化
如果基类有私有成员,并且需要在派生类中的构造函数中初始化。这是会用到基类的复制构造函数。有如下示例:#include "stdafx.h"#include <iostream>#include <string>using namespace std;class base{private: int i;public: base() :i(0) ...原创 2019-11-10 16:27:13 · 1807 阅读 · 0 评论 -
c++中的深复制和浅复制的理解
浅复制就是新旧两个对象指向同一个外部内容,而浅复制是指为新的对象制作了外部对象的独立复制。如下代码所示,如果在类中没有定义复制构造函数,编译器就会生成默认的复制构造函数,这个构造函数就是浅复制的作用,当代码t2 = t1执行的时候,就会执行编译器默认的构造函数。这里默认的构造函数就是将t1中的buf的值也就是指向的地址,复制给了t2,所以代码执行的时候两个指针是相同的:如果在类中添加上...原创 2019-10-21 22:38:58 · 394 阅读 · 0 评论 -
一段简单c++代码帮助理解复制构造函数
复制构造函数被调用的条件:1.一个对象以值得方式传入函数体。2.一个对象以值得方式从函数体返回。3.一个对象需要通过另外一个对象初始化。如下代码:class test1{public: int a; test1(int x) { a = x; cout << "a = " << a << endl; } test1(t...原创 2019-10-20 16:32:41 · 178 阅读 · 0 评论 -
C++中class继承构造函数和析构函数的执行顺序
如下示例:class base{private: int i;public: base(int x) { i = x; cout << "base structor function" << endl; } ~base() { cout << "the class base destructor is called i = "...原创 2019-10-11 21:40:23 · 283 阅读 · 0 评论 -
C++中explicit构造函数的理解
1.explicit类型的构造函数和普通类型的构造函数的区别普通的构造函数可以被显式调用和隐试调用,但是explicit的构造函数只能被显式的调用,不能被隐试的调用。代码示例如下:class test0{private: int i;public: explicit test0(int n) { i = n; cout << "i = " <&...原创 2019-10-10 21:38:15 · 864 阅读 · 0 评论 -
全局对象的构造函数会在main函数之前执行
如下所示代码:#include <iostream>using namespace std;class test{public: test() { cout << "this class constructor is called" << endl; }};test global_test0;test global_test1;...原创 2019-10-09 21:57:25 · 1134 阅读 · 0 评论 -
c++中基类构造函数初始化父类中private成员的方法
代码如下:#include <iostream>using namespace std;class a{private : int i;public: a() {} a(int x) :i(x) {}//初始化列表对private成员初始化 void printa(){ cout << "i = " << i <<...原创 2019-10-08 22:04:25 · 1918 阅读 · 1 评论 -
C++的类中静态成员变量和静态成员函数的理解和使用
c++中静态成员被当做是该类类型的全部变量,对于非静态成员,每个类都有自己的复制品,而静态成员对每个类都只有一个复制。所以静态成员只有一份,由该类类型的所有对象访问。如下代码所示,其中sum成员变量使用了static,声明为静态成员变量。这样的话这个变量就是对象obj1和obj2所共享的。所以在定义两个对象的时候,两个对象的构造函数对sum变量的操作,都是操作的同一个变量,而num就是每个对象...原创 2019-10-07 21:53:39 · 937 阅读 · 0 评论 -
c++中初始化列表初始化顺序和变量的声明顺序一致(初始化列表的构造顺序)
有如下代码所示,很容易想到先用3初始化j,然后再用j初始化i,所以最后调用print成员函数输出的结果是i = 3,j = 3.但是通过运行得出的结果如下面所示,和猜想的不一样。这里分析具体原因。初始化列表初始化的顺序和变量声明的顺序一致,和初始化中的顺序无关。这里的代码中i比j先声明,所以这里的初始化的顺序应该是先用j对i初始化,然后再用k对j初始化。由于在对i初始化的时候j并没有被初始化...原创 2019-10-07 21:23:27 · 1559 阅读 · 0 评论 -
c/c++中的struct和class的区别
主要有两种情况:1.C语言中的struct和c++中的class区别。2.c++中的struct和c++中的class的区别。下面分别介绍:1.C语言中的struct和c++中的class的区别C语言中的struct只能定义成员变量,不能够定义成员函数。如下所示:struct point{ int x; int y; void print() ...原创 2019-10-06 22:27:43 · 1907 阅读 · 0 评论