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 服务器成功处理了请求 ...
随机推荐
- 《剑指offer》— JavaScript(5)用两个栈实现队列
用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现代码 function Stack(){ var item = []; this. ...
- PID控制算法的C语言实现七 梯形积分的PID控制算法C语言实现
在PID控制律中积分项的作用是消除余差,为了减小余差,应提高积分项的运算精度,为此,可将矩形积分改为梯形积分. 梯形积分的计算公式为: pid.voltage=pid.Kp*pid.err+index ...
- Leetcode 7. 整数反转(待整理)
1.题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: ...
- Qt ------ 断开某对信号与槽的connect
QMetaObject::Connection dis; dis = connect(this,&TcpSocket::readyRead,this,&TcpSocket::readD ...
- win32/linux 线程 log
原文 #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32 #includ ...
- Python/spss-多元回归建模-共线性诊断2(推荐AA)
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...
- 替换换行符:回车换行CR/LF
windows采用回车+换行CR/LF表示下一行,UNIX/Linux使用换行符LF表示下一行,MAC OS系统使用用回车符CR表示下一行. CR使用符号'\r'表示, ASCII码是13: LF使用 ...
- 2017 国庆湖南Day2
期望得分:100+30+100=230 实际得分:100+30+70=200 T3 数组开小了 ..... 记录 1的前缀和,0的后缀和 枚举第一个1的出现位置 #include<cstdio& ...
- unZip/Zip的安装
1.apt-get安装: apt-get install zip 2.yum安装: yum install -y unzip zip
- JSON 为王,为什么 XML 会慢慢淡出人们的视野?
目前全球信息基础设施的特点是,拥有大量的数据交换格式.这一点也不奇怪.互联网几乎已经老了,而“物联网”及“大数据”正从概念走进现实.但我仍然相信,在这一领域还有一股较强的历史趋势,推动 JSON 数据 ...