C++语言基础问题
1. C++语言的三大特性?
2. C和C++的区别?
- C语言是C++子集,C++兼容C语言,但是C++又有很多新的特性,如引用,智能指针,auto变量等等。
- C++是面向对象的语言,C事面向过程的编程语言。
- C++中增加了新的特性来改善安全性,如const常量,cast转换,智能指针,try-catch等等;
- C++中引入了模板的概念,代码的可服用性高。
3. C++中的strcut和class的区别
- struct 用于描述一个数据结构集合,而class是对一个对象数据的封装。
- strcut 默认访问控制权限是public,而class默认权限是private;
- 继承关系中,struct是公有继承,而calss是私有继承;
- class可以定义模板参数,而struct不能;
4. C++中的strcut与C中的strcut的区别
| C | C++ |
---|
成员函数 | 无 | 有 |
静态成员 | 无 | 有 |
访问控制 | 默认public,不可修改 | public/private/protected |
继承关系 | 不可继承 | 可从类或者结构体继承 |
初始化 | 不能直接出实话数据成员 | 可初始化 |
5. C++导入C得关键字?
关键字是extern,写法是 extern “C”,主要作用是在编译时该代码按照C编译,而不是C++编译;
6. C和C++编译的区别
由于C++支持重载,编译的过程中会将函数的参数类型加到编译后的代码中,而不仅仅是函数名;C代码不支持重载,故编译时不会带上函数的参数类型,只包括函数名。
7. C++代码到可执行二进制文件的过程
四个过程:预编译,编译,汇编,链接
- 预编译
- define删除,展开宏定义
- 处理条件编译
- 处理include预编译指令
- 过滤注释
- 添加行号和文件名标识
- 编译
- 汇编
- 链接
- 把不同文件产生的目标文件进行链接,行成可执行的程序,链接分为静态链接与动态链接;
8. 静态链接与动态链接
- 静态链接
在链接时就把要调用的函数或者过程链接到了可执行文件中,删除静态库不会影响可执行程序的执行; - 动态链接
程序在执行的额过程中,去找链接的函数,生产的可执行文件中没有函数代码,只包括函数的重定位信息,删除动态库后程序无法执行。
9. static关键字的作用
- 定义全局静态变量与局部静态变量。初始化的静态变量存放在数据段分配内存,微初始化的在BSS段分配内存。直到程序结束,静态变量会始终维持,但是全局与局部作用域不一样。
- 定义静态函数,限定作用域,只能在本源文件中使用。
- 定义内中静态成员函数,与内中静态成员变量。
10. 数组和指针区别
- 数组:是多个相同类型数据的集合,数组名是首元素地址;
- 指针:指针存放的是变量在内存中的地址;
区别: - 赋值:指针变量可以相互赋值,数组不信,只能一个个拷贝;
- 存储方式不一样,数组在内存中是连续的内存空间,根据下标进行访问,而指针可以指向任意数据类型,故大小不能确定。
- sizeof结果不一样。
11. 函数指针
指向函数的指针变量,用于回调函数。
12. 静态变量初始化
- C语言在编译的时候初始化
- C++在对象首次用到时才进行构造。
13. 野指针的产生
野指针:指针指向的位置是不可知的;
产生:释放内存后指针未指空;
避免:初始化置NULL,申请内存判空,释放后置NULL;使用智能指针
int *p = NULL; //初始化置NULL
p = (int *)malloc(sizeof(int)*n); //申请n个int内存空间
assert(p != NULL); //判空,防错设计
p = (int *) realloc(p, 25);//重新分配内存, p 所指向的内存块会被释放并分配一个新的内存地址
free(p);
p = NULL; //释放后置空
int *p2 = NULL; //初始化置NULL
p2 = new int[n]; //申请n个int内存空间
assert(p2 != NULL); //判空,防错设计
delete []p2;
p2 = nullptr; //释放后置空
14. 静态全局变量,静态局部变量,全局变量,局部变量
- 全局变量:全局作用域,可以通过extern作用于其他非定义的源文件;
- 静态全局变量:全局作用域+文件作用域,无法在其他文件使用;
- 局部变量:局部作用域,函数内的局部变量;
- 静态局部变量:局部作用域,只被初始化一次,直到程序结束;
15. 内联函数和宏函数的区别
- 宏函数不是函数,预处理复制宏代码的方式替代了函数的调用;而内联函数本质是一个函数,其代码比较简单;
- 宏函数是预编译的时候把所有的宏名用宏体来替换,就是字符串替换;内联函数是在编译的时候进行代码插入,省去函数调用的开销,提高程序效率;
- 宏定义不会检查类型;内联函数会进行类型检查;
16. New与Malloc的区别
- new是操作符,malloc是函数;
- new在调用时先分配内存,再调用构造函数,释放调用析构函数;而malloc只申请内存空间;
- new不需要指定内存大小,返回指针不用强转;mallco需要指定内存大小,指针需要强转;
- new可以被重载,malloc不行;
- new分配内存更加安全;
- new发生错误错误会抛出异常,malloc会返回null;
17. const与define的区别
- const在编译阶段生效,而dedfine在预处理阶段生效;
- const定义的常量存在在内存中,而define定义的常量,运行时是直接的操作数,并不会放在内存中;
- const定义的常量带内存,define定义的常量不带类型;
- const更加安全,会在编译时检查类型语法,而dedine不会检查;
18. 函数指针与指针函数
- 指针函数:本质是一个函数,返回值为指针。
- 函数指针:函数指针本质是一个指针,指向一个函数
指针函数:int *fun(int x,int y);
函数指针:int (*fun)(int x,int y);
19. C++的传值方式?
- 值传递:不会影响实参的值;
- 引用传递:影响实参的值;
- 指针传递:影响实参的值;
注意:
- 值传递对象时,会拷贝一个副本,导致效率低;
- 引用与指针传递不会发生拷贝行为,只绑定对象;
- 引用比指针传递更加安全;