C++基础
1、static作用
C:在函数体中,static局部变量在被调用过程中维持值不变
在模块内,static变量可被模块内所用函数访问,但模块外函数不能使用,是一个本地的全局变量
在模块内,一个static函数只能被这一模块内的其他函数调用
C++:
在类中,static数据成员可实现多个对象之间的数据共享,是类的所有对象的共享成员,在内存中只占一份空间,如果改变其 值,则所有对象的这个数据成员的值都会改变。静态数据成员在程序开始运行时被分配空间,到程序结束之后释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间。
static成员函数,也是类的静态成员,非静态成员函数有this指针,而静态成员函数没有this指针,静态成员函数主要用来访问静态数据成员而不能访问非静态成员。
2、volatile关键字修饰举例
中断服务程序中修改的供其他程序检测的变量
多任务环境下各个任务间共享的变量
存储器映射的硬件寄存器,因为每次对它的读写都可能有不同意义
3、const和#define
Const常量是编译运行阶段使用,而define宏是预处理阶段展开
const常量有具体的类型,编译时会执行类型检查
const常量是在静态存储区中分配空间,在程序运行过程中内存中仅有一个拷贝,而define仅仅是展开,给出的是立即数,不分配内存
4、重载和覆盖
重载(overload)
函数或者方法有相同的名称,但参数列表不同(类型或顺序或数目)
重写(override)
重写存在于类中,子类重写从基类继承过来的函数,但函数名、返回值和参数列表都必须与基类相同
5、float类型变量判断是否为0
if(a >= -0.00001 && a <= 0.00001)
6、几种排序算法
A、冒泡排序
一次比较两个元素,如果满足排序条件则交换它们的位置,如此重复直到没有需要再交换的元素
for(i = 0;i < len-1;i++)
{
for(j = 0; j < len-1-i;j++)
{
if(arr[j] > arr[j+1])
{
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
B、选择排序
在位排序的序列中找到最小(大)元素,存放到排序的起始位置,再从剩余未排序中继续寻找最小(大)元素放到已排序元素的末尾
for(int i = 0; i < len-1; i++)
{
minIndex = i;
for(int j = i+1; j < len; j++)
{
if(arr[j] < arr[minIndex])
minIndex = j;
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tem;
}
C、插入排序
通过构建有序序列,对于未排序序列数据,在已排序列中从后向前扫描,找到相应位置插入
for(int i = 1; i < len; i++)
{
preIndex = i-1;
current = arr[i];
while(preIndex >= 0 && arr[preIndex] > current)
{
arr[preIndex + 1] = arr[preIndex];
preIndex--;
}
arr[preIndex + 1] = current;
}
D、希尔排序
先将整个待排序的序列分割成若干个序列(选择一个增量),再分别进行插入排序
for(int gap = len/2;gap > 0;gap = gap/2)
{
for(int i = gap; i<len;i++)
{
int j = i;
int current = arr[i];
while(j - gap >= 0 && current < arr[j-gap])
{
arr[j] = arr[j-gap];
j = j - gap;
}
arr[j] = current;
}
E、二分查找
int left = 0;
int right = length - 1;
while(left <= right)
{
int mid = (right + left) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
left = mid +1;
else
right = mid -1;
}