C++八股学习day4

1、 C++和C语言的区别

1.C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、auto变量等;
2.C++是面对对象的编程语言;C语言是面对过程的编程语言;
3.C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
4.C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL。C++的STL库相对于C语言的函数库更灵活、更通用。

2、C++中 struct 和 class 的区别

1.struct 一般用于描述一个数据结构集合,而 class 是对一个对象数据的封装
2.struct 中默认的访问控制权限是 public 的,而 class 中默认的访问控制权限是 private 的;
3.在继承关系中,struct 默认是公有继承,而 class 是私有继承;
4.class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数。

3、C++结构体和C结构体的区别

1.C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数;
2.C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种;
3.C 中使用结构体需要加上 struct 关键字,或者对结构体使用 typedef 取别名,而 C++ 中可以省略 struct 关键字直接使用;
4.C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。

4、static关键字的作用

1.定义全局静态变量局部静态变量:在变量前面加上static关键字。static的变量默认初始化为0。(static变量)初始化的静态变量会在数据段分配内存,未初始化的静态变量会在BSS段分配内存。直到程序结束,静态变量始终会维持前值。只不过全局静态变量和局部静态变量的作用域不一样;
2.定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数。静态函数只能在本源文件中使用
3.在变量类型前加上static关键字,变量即被定义为静态变量。静态变量只能在本源文件中使用;
4.在c++中,static关键字可以用于定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间,static修饰的变量要在类外初始化。
5.在c++中,static关键字可以用于定义类中的静态成员函数:与静态成员变量类似,类里面同样可以定义静态成员函数。只需要在函数前加上关键字static即可。如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间,只能访问类的static成员变量,static修饰的变量要在类外初始化。

5、数组和指针的区别

(1)数组:数组是用于储存多个相同类型数据的集合。数组名是首元素的地址。

(2)指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。指针名指向了内存的首地址。

区别:

赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝
存储方式:
数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,数组的存储空间,不是在静态区就是在栈上
指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。

6、什么是函数指针,如何定义函数指针,有什么使用场景

函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。

指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。

定义形式:

int func(int a); 
int (*f)(int a); 
f = &func;

指针函数:int *fun(int x,int y);
函数指针:int (*fun)(int x,int y)

使用场景: 回调(callback)。我们调用别人提供的 API函数(Application Programming Interface,应用程序编程接口),称为Call;如果别人的库里面调用我们的函数,就叫Callback。

//以库函数qsort排序函数为例,它的原型如下:
void qsort(void *base,//void*类型,代表原始数组
           size_t nmemb, //第二个是size_t类型,代表数据数量
           size_t size, //第三个是size_t类型,代表单个数据占用空间大小
           int(*compar)(const void *,const void *)//第四个参数是函数指针
          );
//第四个参数告诉qsort,应该使用哪个函数来比较元素,即只要我们告诉qsort比较大小的规则,它就可以帮我们对任意数据类型的数组进行排序。在库函数qsort调用我们自定义的比较函数,这就是回调的应用。

//示例
int num[100];
int cmp_int(const void* _a , const void* _b){//参数格式固定
    int* a = (int*)_a;    //强制类型转换
    int* b = (int*)_b;
    return *a - *b;  
}
qsort(num,100,sizeof(num[0]),cmp_int); //回调

7、什么是野指针,怎么产生的,如何避免?

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的);

  1. 产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。

  2. 避免办法:

    (1)初始化置NULL

    (2)申请内存后判空

    (3)指针释放后置NULL

    (4)使用智能指针

8、静态局部变量,全局变量,局部变量的特点,以及使用场景


首先从作用域考虑:C++里作用域可分为6种:全局,局部,类,语句,命名空间和文件作用域。

全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。

静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。

局部变量:局部作用域,比如函数的参数,函数内的局部变量等等。

静态局部变量 :局部作用域,只被初始化一次,直到程序结束。

从所在空间考虑:除了局部变量在栈上外,其他都在静态存储区。因为静态变量都在静态存储区,所以下次调用函数的时候还是能取到原来的值。

生命周期: 局部变量在栈上,出了作用域就回收内存;而全局变量、静态全局变量、静态局部变量都在静态存储区,直到程序结束才会回收内存。

9、new和malloc的区别,各自底层实现原理


new是操作符,而malloc是函数
new在调用的时候先分配内存,在调用构造函数,释放的时候调用析构函数;而malloc没有构造函数和析构函数。
malloc需要给定申请内存的大小,返回的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转。
new可以被重载;malloc不行
new分配内存更直接和安全。
new发生错误抛出异常,malloc返回null


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值