C++面试总结
1、多态
C++多态分两种--静态和动态,其中静态联编支持的多态称为编译时多态,包括重载和模板;动态联编支持的多态称为运行时多态,包括
继承和虚函数实现。
多态主要是由虚函数实现的,虚函数允许子类重新定义基类的虚函数(override);重载(overload)则是一个类中有多个同名函数,这些函数的参数列
表不同(参数类型、个数)。
多态的目的是为了接口重用:不论传递过来的是哪个类的对象,都能通过同一个接口调用到适应各自对象的实现办法。
最常用的方法就是声明基类的指针,利用该指针指向子类对象,调用相应的虚函数,可以根据指向子类的不同而调用不同的虚函数。
2.四种类型转换
static_cast:基本数据类型转换(int->float);类层次结构中上行转换(派生类转为基类),下行转换不安全。
dynamic_cast:类层次间的上、下行转换,都是安全的,下行转换会检查被转换的类(基类)是否有虚函数,有虚函数才合法。
reinterpret_cast:将一个类型的指针转为另一个类型的指针。
const_cast:把const类型的指针转为非const类型的指针。
3.运算符重载
单目声明为成员函数,多目声明为友元。
重载流插入和流提取运算符:istream& operator >>(istream&,自定义类&),只能定义为友元或普通函数。
4、内存对齐原则
1.数据成员对齐规则:struct, union的数据成员,第一个数据成员放在offset为0的地方,之后的数据成员的存储起始位置都是放在该数据成员大小的整数倍位置。如在32bit的机器上,
int的大小为4,因此int存储的位置都是4的整数倍的位置开始存储。
2.结构体作为数据成员的对齐规则:在一个struct中包含另一个struct,内部struct应该以它的最大数据成员大小的整数倍开始存储。如 struct A 中包含 struct B, struct B 中包含数据
成员 char, int, double,则 struct B 应该以sizeof(double)=8的整数倍为起始地址。
3.收尾工作的对齐规则:整个struct的大小,应该为最大数据成员大小的整数倍。
5、模板实现
函数模板:
template<typename T 或 class T>
T max(T a, T b ,T c)
类模板:
template<typename T> class 类名{ }
6、指针和const
指向常量的指针:不能用于改变所指常量的值
const double pi = 3.14
const double *cptr = π
常量指针:指针本身为常量(指针为对象,引用不是,所以没有常量引用),必须初始化且指针中的地址不能再改变。
int errNum = ;
int * const curErr = &errNum;
指向常量的常量指针:既不能修改指向的对象,也不能修改只想对象的值
7、虚函数
C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。子类可以重写父类的虚函数实现子类的特殊化。
C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。纯虚函数无函数体:viutual float area()const=0;
基类的析构函数要定义为虚函数,防止delete基类指针时,只调用基类的析构函数而不执行派生类的析构函数。
8、内联函数
执行普通函数时,程序会先进行入栈保护,转到函数位置执行函数,然后再返回。需要一定的开销。
程序无需跳到另外一个位置执行代码,使用函数代码替换函数调用,调用快,无需内存开销。
宏:内联代码的参数是按值传递的,宏是通过文本替换。
区别:
(1)内联函数在编译时展开,宏在预编译时展开;
(2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;
(3)内联函数有类型检测、语法判断等功能,而宏没有;
(4)inline函数是函数,宏不是;
(5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;
9、typedef
四种用途(主要是为了定义别名),参考:http://www.cnblogs.com/charley_yang/archive/2010/12/15/1907384.html
关于和define的区别,参考:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html
10、静态数据成员和静态成员函数
静态数据成员被当作类的成员,在程序中只有一份拷贝,只分配一次内存,由该类的所有对象共享访问,对每个对象的值都一样。
定义时要分配空间,所以不能在类声明中定义。
属于类,不能访问类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其余的静态函数。
11、模版特化
针对特殊的类型,需要进行特殊处理。参考这篇博客给的例子:http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810372.html
12、explicit关键字
在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。加入explicit是为了
防止类构造函数的隐式自动转换,只对有一个参数的构造函数有效(参数个数大于等于2时不会发生隐式转换);或除了第一个参数外,其他参数都有默认值时同样有效。
具体便子可参考:http://www.cnblogs.com/ymy124/p/3632634.html
13、new/delete、malloc/free之间的区别
1、new、delete是c++中的操作符,malloc、free是C中的一个库函数,它们都可用于申请动态内存和释放内存。
2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
14、为什么要用static_cast转换而不用c语言中的转换
C中强制转换编译时不同类型(比如完全不同的两个类)也可通过,但static_cast不能通过,多了编译时的类型检查,更安全。
15、异常机制
try catch throw
16、c++ 必须在构造函数初始化表里进行初始化的数据成员有哪些
常量成员、引用类型、没有默认构造函数的类类型(只能用拷贝构造函数)
17、auto_ptr
就是动态分配对象以及当对象不再需要时自动执行清理
具体参考:http://www.cnblogs.com/bizhu/archive/2012/07/29/2614355.html
18、extern "C"
参考:http://blog.csdn.net/jiqiren007/article/details/5933599
C++面试总结的更多相关文章
- C++常见笔试面试要点以及常见问题
1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...
- [Java面经] 关于面试的二三事.
今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...
- 在面试中忽然发现DateTime的一些...
今天说说我面试中碰到的一个小问题,在我问起DateTime为什么无法赋值NULL值,一般第一反应都认为它是值类型,不是引用类型,但随后我查阅了度娘自我学习到它是结构类型,那么随之而然就无法赋值NULL ...
- 2016年8月ios面试问题总结
1.app分发方式 所谓分发方式简单点讲就是你的app都可以通过哪些途径给用户使用. a:个人或者公司的开发者账号 可以上传appStore,用户通过appStore下载. b:企业账号:打包分发. ...
- 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮
(出处:http://www.cnblogs.com/linguanh/) 前序: 距离 2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Android面试经验 -- 乐视
此次投的是三年经验的Android开发,最后反而因为自己的失误,没有准备充分而导致结果很悲剧,以此告诫自己千万不能疏忽大意. 面试过程 第一次去大公司面试,心里不是一般的激动和紧张,来到乐视大厦门口, ...
- Android面试一天一题(1Day)
写在前面 该博客思路源于在简书看到goeasyway博主写的Android面试一天一题系列,无copy之意,仅为让自己总结知识点,成长一点点.先感谢各位大神的无私分享~! 关于题目,大部分则出自And ...
- Java面试基础概念总结
面向对象软件开发的优点有哪些? 答:开发模块化,更易维护和修改:代码之间可以复用:增强代码的可靠性.灵活性和可理解性. 多态的定义? 答:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力. ...
- 【干货分享】前端面试知识点锦集04(Others篇)——附答案
四.Others部分 技术类 1.http状态码有哪些?分别代表是什么意思? (1).成功2×× 成功处理了请求的状态码.200 服务器已成功处理了请求并提供了请求的网页.204 服务器成功处理了请求 ...
随机推荐
- HiHoCoder1513:小Hi的烦恼——题解
https://hihocoder.com/problemset/problem/1513 小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好. 小Hi在高中期间参加了市 ...
- 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...
- mysql三-2:数据类型
一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data ...
- 网络协议之DHCP与Route20170330
由于要使用网络通讯,所以不可避免的要用到dhcp.理想的网络通讯方式是下面3种都要支持: 1,接入已有网络.这便要求可以作为dhcp客户端. 2,作为DHCP服务器,动态分配IP. 3,指定固定IP ...
- Overlaying GPS Coordinates for Camera Crosshairs
Hey Guys! I am working on a project to allow us to implement GPS coordinates for the location of the ...
- 洛谷P1106 删数问题
题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和 ...
- php 性能优化之opcache - 让你的php性能提升 50%
性能提升原理:减少文件解析的时间. 我们都知道,程序要运行,得有一个编译或者解析的过程,编译或解析之后的代码才是机器可以运行的. 而 php 是一种解析性语言,在使用php来处理http请求的时候,每 ...
- 58到家mysql数据库军规及解读分享
一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...
- Codeforces 221 A. Little Elephant and Function
A. Little Elephant and Function time limit per test 2 seconds memory limit per test 256 megabytes in ...
- ZOJ 3787 Access System 水
LINK:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3787 思路:结构体 时间转化为秒记录下最小并且排序就好了 /** ...