栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++面试常见问题 — C++语言基础

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++面试常见问题 — C++语言基础

C++语言基础问题 1. C++语言的三大特性?
  • 封装
  • 继承
  • 多态
2. C和C++的区别?
  1. C语言是C++子集,C++兼容C语言,但是C++又有很多新的特性,如引用,智能指针,auto变量等等。
  2. C++是面向对象的语言,C事面向过程的编程语言。
  3. C++中增加了新的特性来改善安全性,如const常量,cast转换,智能指针,try-catch等等;
  4. C++中引入了模板的概念,代码的可服用性高。
3. C++中的strcut和class的区别
  1. struct 用于描述一个数据结构集合,而class是对一个对象数据的封装。
  2. strcut 默认访问控制权限是public,而class默认权限是private;
  3. 继承关系中,struct是公有继承,而calss是私有继承;
  4. class可以定义模板参数,而struct不能;
4. C++中的strcut与C中的strcut的区别
CC++
成员函数
静态成员
访问控制默认public,不可修改public/private/protected
继承关系不可继承可从类或者结构体继承
初始化不能直接出实话数据成员可初始化
5. C++导入C得关键字?

关键字是extern,写法是 extern “C”,主要作用是在编译时该代码按照C编译,而不是C++编译;

6. C和C++编译的区别

由于C++支持重载,编译的过程中会将函数的参数类型加到编译后的代码中,而不仅仅是函数名;C代码不支持重载,故编译时不会带上函数的参数类型,只包括函数名。

7. C++代码到可执行二进制文件的过程

四个过程:预编译,编译,汇编,链接

  1. 预编译
    • define删除,展开宏定义
    • 处理条件编译
    • 处理include预编译指令
    • 过滤注释
    • 添加行号和文件名标识
  2. 编译
    • 词法,语法,语意分析
    • 代码优化
    • 生产汇编代码
  3. 汇编
    • 汇编代码转换为机器代码
  4. 链接
    • 把不同文件产生的目标文件进行链接,行成可执行的程序,链接分为静态链接与动态链接;
8. 静态链接与动态链接
  1. 静态链接
    在链接时就把要调用的函数或者过程链接到了可执行文件中,删除静态库不会影响可执行程序的执行;
  2. 动态链接
    程序在执行的额过程中,去找链接的函数,生产的可执行文件中没有函数代码,只包括函数的重定位信息,删除动态库后程序无法执行。
9. static关键字的作用
  1. 定义全局静态变量与局部静态变量。初始化的静态变量存放在数据段分配内存,微初始化的在BSS段分配内存。直到程序结束,静态变量会始终维持,但是全局与局部作用域不一样。
  2. 定义静态函数,限定作用域,只能在本源文件中使用。
  3. 定义内中静态成员函数,与内中静态成员变量。
10. 数组和指针区别
  1. 数组:是多个相同类型数据的集合,数组名是首元素地址;
  2. 指针:指针存放的是变量在内存中的地址;
    区别:
  3. 赋值:指针变量可以相互赋值,数组不信,只能一个个拷贝;
  4. 存储方式不一样,数组在内存中是连续的内存空间,根据下标进行访问,而指针可以指向任意数据类型,故大小不能确定。
  5. sizeof结果不一样。
11. 函数指针

指向函数的指针变量,用于回调函数。

12. 静态变量初始化
  1. C语言在编译的时候初始化
  2. 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. 静态全局变量,静态局部变量,全局变量,局部变量
  1. 全局变量:全局作用域,可以通过extern作用于其他非定义的源文件;
  2. 静态全局变量:全局作用域+文件作用域,无法在其他文件使用;
  3. 局部变量:局部作用域,函数内的局部变量;
  4. 静态局部变量:局部作用域,只被初始化一次,直到程序结束;
15. 内联函数和宏函数的区别
  1. 宏函数不是函数,预处理复制宏代码的方式替代了函数的调用;而内联函数本质是一个函数,其代码比较简单;
  2. 宏函数是预编译的时候把所有的宏名用宏体来替换,就是字符串替换;内联函数是在编译的时候进行代码插入,省去函数调用的开销,提高程序效率;
  3. 宏定义不会检查类型;内联函数会进行类型检查;
16. New与Malloc的区别
  1. new是操作符,malloc是函数;
  2. new在调用时先分配内存,再调用构造函数,释放调用析构函数;而malloc只申请内存空间;
  3. new不需要指定内存大小,返回指针不用强转;mallco需要指定内存大小,指针需要强转;
  4. new可以被重载,malloc不行;
  5. new分配内存更加安全;
  6. new发生错误错误会抛出异常,malloc会返回null;
17. const与define的区别
  1. const在编译阶段生效,而dedfine在预处理阶段生效;
  2. const定义的常量存在在内存中,而define定义的常量,运行时是直接的操作数,并不会放在内存中;
  3. const定义的常量带内存,define定义的常量不带类型;
  4. const更加安全,会在编译时检查类型语法,而dedine不会检查;
18. 函数指针与指针函数
  1. 指针函数:本质是一个函数,返回值为指针。
  2. 函数指针:函数指针本质是一个指针,指向一个函数
指针函数:int *fun(int x,int y);
函数指针:int (*fun)(int x,int y);
19. C++的传值方式?
  1. 值传递:不会影响实参的值;
  2. 引用传递:影响实参的值;
  3. 指针传递:影响实参的值;

注意:
- 值传递对象时,会拷贝一个副本,导致效率低;
- 引用与指针传递不会发生拷贝行为,只绑定对象;
- 引用比指针传递更加安全;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1038357.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号