c++中static关键字的作用
static是用来声明静态变量、静态函数、类的静态成员、类的静态函数等
对声明静态变量来说共分为两种静态变量
- 局部静态变量 :
1. 在局部变量的前面添加上关键字static,局部变量就变成了局部静态变量;
2. 局部静态变量在内存中位置是->静态存储区
3. 初始化:任意
4. 作用域: 局部静态变量的作用域,仍然是在局部的作用域,如,在一个函数中声明了一个静态变量,那么这个变量就是局部静态变量,当出了函数的作用范围之外,这个静态变量不能被使用,但是并没有被销毁,当这个函数再次被调用的时候,才可以继续使用这个静态变量,并且值是不变的 - 全局静态变量:
- 在全局变量的前面加上关键字static,全局变量就变成了全局静态变量
- 全局静态变量的存储位置是在->静态存储区
- 全局静态变量被初始化为0,
- 全局静态变量在声明他的文件之外是不可见的,从定义开始,到文件结尾;
有关c++内存分配方式详解c++内存的分配方式
- 静态函数
1. 在函数返回类型前面添加static修饰,这样做可以令此函数只能在当前的cpp中使用,不会痛其他的cpp中同名的函数产生冲突 - 类中的静态成员
- 在类中声明了一个静态成员,那么这个静态成员是可以实现多个对象的数据共享的,存储在静态区
- 类的静态函数
- 在类中声明 成员函数的类型是static,并不属于某一个类的对象,而是属于所有的类对象
说一下c++中static关键字的作用
对于函数定义和代码快之外的变量声明,static修改标识符的链接属性,由默认的external变成internal,作用域和存储类型不变
拥有external链接属性的变量可以被所有文件访问,只需要声明一下即可
拥有internal属性的变量只能在其定义的文件中被访问
拥有none属性的变量只能在其定义开始到代码块作用域结束处访问
c++中四种cast转换(向上转换:子类向基类转换,向下转换:基类向子类转换)
- static_cast : 可以应用于任何类型的隐式转化(只要不包含底层const),比如非const转换为const ,void*转换为其他类型的指针等,但是只能向上转换,向下转换不安全
- const_cast : 用于将const 变量转换为非congst(只能转换底层const)
- reinterpret_cast :几乎什么都可以通过他进行强行转换,但是建议别用
- dynamic_cast:动态类型的转换,只能用于含有虚函数的类
强制类型的转换
c++中指针和引用的区别
- 指针拥有自己的内存空间,但是引用没有,引用只不过是一个变量的地址别名;
- 对指针使用sizeof,一般大小是4,对引用使用计算的是被引用对象的大小
- 普通指针在使用的过程中是可以指向其他的对象的,但是引用的话只能是一个对象的引用,不能被改变
判断两个矩形是否相交?
根据两个矩形的中心距离是否在0-(1/2l1+1/2l2)之间
判断点是否在三角形内
根据三个顶点加上判断的点,四个点形成的三角形面积之和是否等于大的三角形面积来判断
c++中的四个智能指针
在另一篇博客中
怎样判断一个数是二的倍数,怎么求一个数中有几个1,怎样求一个二进制数字中有几个1
- 判断是否是2的倍数,将待检测的数转换为二进制形式,判断最低为是否是1
- 通过除十取余
int hammingWeight(uint32_t n) {
int count = 0;
unsigned int flag = 1;
while(flag)
{
if(n&flag)
{
count++;
}
flag = flag<<1;
}
return count;
}
通过将待判断的数转换为二进制,然后令转换后的数字和1 进行与运算,运算结束后左移一位继续相与,通过计数来判断是否有1
数组与指针的区别
- 数组保存的是数据; 指针保存的是数据的地址
- 数组可以直接访问数据;指针通过解引用来访问数据
- 数组是同一种类型且数目固定的元素;指针用于动态数据结构
- 数组一般是隐式的分配和删除;指针是通过malloc进行动态的分配和删除(free)
什么是野指针
野指针就是指向内存不可用的指针
常见的三种野指针:
1.指针变量没有被初始化
#include <iostream>
usingnamespacestd;
intmain()
{
int* p;
cout<<*p<<endl; //编译通过,运行时出错
}
- 指针所指对象已经被释放
比如说:指针指向某个对象之后,当这个对象的声明周期已经接受,对象已经消亡后,仍然使用指针访问该对象
如下
#include <iostream>
usingnamespacestd;
int* retAddr()
{
intnum=10;
return#
}
intmain()
{
int* p=NULL;
p=retAddr();
cout<<&p<<endl;
cout<<*p<<endl;
}
3.指针释放之后未制空
指针被free或者delete之后,没有置为null,这个时候指针指向的就是垃圾内存,释放后的指针应该立即职位null防止产生野指针
智能指针有没有内存泄漏的情况
当两个相同的shared_ptr相互引用的时候,会导致shared_ptr指针的引用计数无法归0,也就是所指向的内存始终无法释放;
上述代码中,parent有一个shared_ptr类型的成员指向孩子,而child也有一个shared_ptr类型的成员指向父亲。然后在创建孩子和父亲对象时也使用了智能指针c和p,随后将c和p分别又赋值给child的智能指针成员parent和parent的智能指针成员child。从而形成了一个循环引用,导致计数器无法归0,造成内存泄漏
如何解决智能指针导致内存泄漏的情况
通过使用weak_ptr指针
弱引用的智能指针weak_ptr是用来监视shared_ptr的,不会使引用计数加一,它不管理shared_ptr内部的指针,主要是为了监视shared_ptr的生命 周期,更像是shared_ptr的一个助手。 weak_ptr没有重载运算符*和->,因为它不共享指针,不能操作资源,主要是为了通过shared_ptr获得资源的监测权,它的构造不会增加引用计数,它的析构不会减少引用计数,纯粹只是作为一个旁观者来监视shared_ptr中关连的资源是否存在。 weak_ptr还可以用来返回this指针和解决循环引用的问题。在使用的时候,把产生循环引用的其中一方shared_ptr修改成weak_ptr 即可解决