当前位置:   article > 正文

c++面经基础知识汇总(1)(static、强制转换、指针和引用的区别、智能指针、数组与指针的区别)_c基础指针和引用的区别;介绍static全局变量和静态变量,其存储位置是哪

c基础指针和引用的区别;介绍static全局变量和静态变量,其存储位置是哪
c++中static关键字的作用

static是用来声明静态变量、静态函数、类的静态成员、类的静态函数等
对声明静态变量来说共分为两种静态变量

  1. 局部静态变量 :
    1. 在局部变量的前面添加上关键字static,局部变量就变成了局部静态变量;
    2. 局部静态变量在内存中位置是->静态存储区
    3. 初始化:任意
    4. 作用域: 局部静态变量的作用域,仍然是在局部的作用域,如,在一个函数中声明了一个静态变量,那么这个变量就是局部静态变量,当出了函数的作用范围之外,这个静态变量不能被使用,但是并没有被销毁,当这个函数再次被调用的时候,才可以继续使用这个静态变量,并且值是不变的
  2. 全局静态变量:
    1. 在全局变量的前面加上关键字static,全局变量就变成了全局静态变量
    2. 全局静态变量的存储位置是在->静态存储区
    3. 全局静态变量被初始化为0,
    4. 全局静态变量在声明他的文件之外是不可见的,从定义开始,到文件结尾;
有关c++内存分配方式详解c++内存的分配方式
  1. 静态函数
    1. 在函数返回类型前面添加static修饰,这样做可以令此函数只能在当前的cpp中使用,不会痛其他的cpp中同名的函数产生冲突
  2. 类中的静态成员
    1. 在类中声明了一个静态成员,那么这个静态成员是可以实现多个对象的数据共享的,存储在静态区
  3. 类的静态函数
    1. 在类中声明 成员函数的类型是static,并不属于某一个类的对象,而是属于所有的类对象
说一下c++中static关键字的作用

对于函数定义和代码快之外的变量声明,static修改标识符的链接属性,由默认的external变成internal,作用域和存储类型不变

拥有external链接属性的变量可以被所有文件访问,只需要声明一下即可
拥有internal属性的变量只能在其定义的文件中被访问

拥有none属性的变量只能在其定义开始到代码块作用域结束处访问

[C++]存储连续性、作用域和链接属性总结

c++中四种cast转换(向上转换:子类向基类转换,向下转换:基类向子类转换)
  1. static_cast : 可以应用于任何类型的隐式转化(只要不包含底层const),比如非const转换为const ,void*转换为其他类型的指针等,但是只能向上转换,向下转换不安全
  2. const_cast : 用于将const 变量转换为非congst(只能转换底层const)
  3. reinterpret_cast :几乎什么都可以通过他进行强行转换,但是建议别用
  4. dynamic_cast:动态类型的转换,只能用于含有虚函数的类
    强制类型的转换
c++中指针和引用的区别
  1. 指针拥有自己的内存空间,但是引用没有,引用只不过是一个变量的地址别名;
  2. 对指针使用sizeof,一般大小是4,对引用使用计算的是被引用对象的大小
  3. 普通指针在使用的过程中是可以指向其他的对象的,但是引用的话只能是一个对象的引用,不能被改变
判断两个矩形是否相交?

根据两个矩形的中心距离是否在0-(1/2l1+1/2l2)之间

判断点是否在三角形内

根据三个顶点加上判断的点,四个点形成的三角形面积之和是否等于大的三角形面积来判断

c++中的四个智能指针

在另一篇博客中

怎样判断一个数是二的倍数,怎么求一个数中有几个1,怎样求一个二进制数字中有几个1
  1. 判断是否是2的倍数,将待检测的数转换为二进制形式,判断最低为是否是1
  2. 通过除十取余
int hammingWeight(uint32_t n) {
        int count = 0;
        unsigned int flag = 1;
        while(flag)
        {
            if(n&flag)
            {
                count++;
            }
            flag = flag<<1;
        }
        return  count;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

通过将待判断的数转换为二进制,然后令转换后的数字和1 进行与运算,运算结束后左移一位继续相与,通过计数来判断是否有1

数组与指针的区别
  1. 数组保存的是数据; 指针保存的是数据的地址
  2. 数组可以直接访问数据;指针通过解引用来访问数据
  3. 数组是同一种类型且数目固定的元素;指针用于动态数据结构
  4. 数组一般是隐式的分配和删除;指针是通过malloc进行动态的分配和删除(free)
什么是野指针

野指针就是指向内存不可用的指针
常见的三种野指针:
1.指针变量没有被初始化

#include <iostream>
usingnamespacestd;
intmain()
{
int* p;
cout<<*p<<endl; //编译通过,运行时出错
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 指针所指对象已经被释放
    比如说:指针指向某个对象之后,当这个对象的声明周期已经接受,对象已经消亡后,仍然使用指针访问该对象
    如下
#include <iostream>
usingnamespacestd;

int* retAddr()
{
intnum=10;
return&num;
}

intmain()
{
int* p=NULL;
p=retAddr();
cout<<&p<<endl;
cout<<*p<<endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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 即可解决

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/469833
推荐阅读
相关标签
  

闽ICP备14008679号