C和C++的语法篇:
1.C++特点:
1.c++的三大特点:封装、继承、多态
2.c++是面向对象的,而c是面向过程的
3.C++更加安全,增加了const常量、引用、
四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try—catch等等
4.C++可复用性高,C++引入了模板的概念,后面在此基础上,
实现了方便开发的标准模板库STL(Standard Template Library)
2.C语言和C++的区别
1.c语言是c++的子集,c++可以很好兼容c语言,同时又增加了自己特性,如:引用,智能指针
2.c是面向过程的,c++是面向对象的
3.c++增强了安全性如:四类cast转换、智能指针
4.C++可复用性高,C++引入了模板的概念,后面在此基础上,
实现了方便开发的标准模板库STL(Standard Template Library)
3.C++中 struct 和 class 的区别
1.struct 一般用于描述数据结构体的集合,而class是对一个对象数据的封装
2.struct默认访问权限是共有的,而class默认访问权限是私有的
3.在继承中struct默认是共有继承,而class中默认是私有
4.class可以定义模板参数就像 typename,而struct是是不可以定义模板参数
4.C++结构体和C结构体的区别
1.(函数)c的结构体是不允许有函数,c++允许内部有私有成员,并且允许该函数是虚函数
2.(访问权限)c中对内部成员变量的访问权限是共有的,而在c++中可以是 public,private,protected
3.(继承)c中结构体是不可以继承,而c++的结构体是可以从其他结构体或者类中继承过来
4. C 中使用结构体需要加上 struct 关键字,或者对结构体使用 typedef 取别名,而 C++ 中可以省略 struct 关键字直接使用
5.导入C函数的关键字是什么,C++编译时和C有什么不同?
1.关键字:在C++中,导入C函数的关键字是extern,表达形式为extern “C”
2.编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,
而不仅仅是函数名;
而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名
6、static关键字的作用
1.定义静态全局变量、静态局部变量
:已经初始化的静态变量存放在.data,未初始化的静态变量放在.bss
只不过静态全局变量作用域是在本文件,而静态局部变量是作用在该函数
2.定义函数
:在函数前面加上 static 修辞,表明该函数只能作用域本文件
3.在c++中,static关键字可以用于定义类中的静态成员变量:
这样的变量是不占用类空间,并且是在类外面初始化,该类的所有对象共享这个静态变量
4.在c++中,static关键字可以用于定义类中的静态成员函数
静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针(划重点,面试题常考)。
既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。
7、数组和指针的区别
1.概念:
数组:数组是相同数据类型的集合,数组名是首元素的地址
指针:指针相当于一个变量,指针里面存放的是别的变量的地址,指针名指向内存的首地址
2.区别:
赋值:
相同类型指针可以相互赋值,数组不行,只能一个个元素赋值
存储方式:
数组的内存地址是连续,数组是根据数组下标进行访问的
指针的存储空间是不确定的
求sizeof():
数组所占存储空间大小: sizeof (数组名)/sizeof(数据类型)
指针:在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,
在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8
初始化:
指针操作:
8.什么是函数指针,如何定义函数指针,有什么使用场景
函数指针:
形式:int (*f)(int a)
概念:首先是个指针,这个指针指向函数
应用场景:回调callback,
callback:是指别人的库调用我们自己的函数,比如
pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数3就是函数指针
call:我们调用别人的函数
9.什么是指针函数,如何定义,有什么使用场景
指针函数:
概念:首先是函数,这个函数的返回值是个指针
格式:int * fun(){}
10.静态变量什么时候初始化?
对于c语言来说,静态变量是在编译时初始化
对于c++来说,在对象首次用到时初始化
11.nullptr调用成员函数可以吗?
能。
原因:因为在编译时对象就绑定了函数地址,和指针空不空没关系。
12.说说什么是野指针,怎么产生的,如何避免?
野指针是指指针指向的地址没有确定或者是不可知的
产生:释放内存后没有把指针置空
避免办法:
1.初始化时 NULL
2.申请内存后判空
3.释放内存指针NULL
4.使用智能指针
13.说说静态局部变量,全局变量,局部变量的特点,以及使用场景
1.凡是静态变量和全局变量都存放在静态存储段,而局部变量是存储在栈空间
2.静态变量和全局变量直到程序结束才消失,而局部变量就没了
14.说说运算符i++和++i的区别
1.赋值顺序不同:
i++是先赋值再加,++i是先加再赋值
2.效率不同:
后置++的效率比前++的效率高
15.说说new和malloc的区别,各自底层实现原理。
1. new 是操作符,而malloc是函数
2. new 在调用的时候是先分配空间,然后运行构造函数,而malloc没有构造函数
3. malloc 的返回值是需要强转,而new不需要强转
4.new可以被重载,malloc不可以
5.new更加安全
malloc底层实现:
开辟内存小于128K时调用brk()函数,开辟内存大于128k调用mmap();
malloc采用的是内存池的管理方式,以减少内存碎片
new底层实现:
关键字new在调用构造函数的时候实际上进行了如下的几个步骤:
1.创建一个新的对象
2.将构造函数的作用域赋值给这个新的对象(因此this指向了这个新的对象)
3.执行构造函数中的代码(为这个新对象添加属性)
4.返回新对象
16.说说const和define的区别
const用于定义常量;而define用于定义宏,而宏也可以用于定义常量。
都用于常量定义时,它们的区别有:
1.const生效于编译的阶段;define生效于预处理阶段。
2.const定义的常量,在C语言中是存储在内存中、需要额外的内存空间的;
define定义的常量,运行时是直接的操作数,并不会存放在内存中。
3.const定义的常量是带类型的;define定义的常量不带类型。因此define定义的常量不利于类型检查
17.说说 const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点。
1. const int *a中const修辞的是*a,即指针指向的地址的内容不允许修改,指针指向的地址可以修改
2. int const * a 和第一个是一样
3.const int a 中const修辞的是a,表示a是常量,只允许定义的时候初始化
4.int *const a中const修辞的是指针a,即指针指向的地址不允许修改,只允许修改指针指向的地址的内容
5.const int *const a即不允许修改指针指向的地址,也不允许修改指针指向的地址的内容
18.简述C++有几种传值方式,之间的区别是什么?
传参方式有这三种:值传递、引用传递、指针传递
1、值传递:形参即使在函数体内值发生变化,也不会影响实参的值;
2、引用传递:形参在函数体内值发生变化,会影响实参的值;
3、指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化,会影响实参的值;
|