语法问题
1.static的作用
修饰局部变量:原本被放在栈区的局部变量被放在了全局区,生命周期变长。
修饰全局变量:让变量无法被外部链接。
修饰函数:让函数无法被外部链接。
修饰成员变量:类内声明,类外初始化。没有this指针。多个类共享静态成员变量。可以被非静态成员函数访问。
类内:class Data{static int m;};
类外:int Data::m=0;
修饰成员函数:类内声明,类外初始化。没有this指针,只能访问静态成员变量和其他静态成员函数。可以被非静态成员函数访问。
类内:class Student{static float average();};
类外:float Student::average(){if(count)return sum/count;};
2.const的作用
修饰局部变量:局部变量无法被修改。
常量指针:不能通过常量指针改变变量的值,但是可以通过其他方式来改变变量的值。
const int* p =&a;
指针常量:指针在前,常量符号在后。指针指向的方向无法改变。
int* const p=&a;
修饰成员变量:只能在构造函数中进行初始化。
修饰成员函数:只可读取成员变量,不可修改成员变量。
void test01()const
{
cout<<"you can not change these things"<<endl;
}
3.在main执行前后可能执行的代码?
之前:
栈区:设置栈指针
局区:初始化静态变量,全局变量,全局对象等,未初始化的变量赋初值。全局对象中的构造函数。
__attribute((constructor))
将main函数的参数传递给main,如argc和argv。
之后:
全局区:静态对象的析构函数,全局对象的析构函数。
__attribute((destructor))
用atexit注册的函数
其他
1.C++和各语言对比
C++和python对比:
python是解释性语言,执行效率偏低,但是自带的库较多,多用于机器学习等操作。
C++是编译性语言,执行效率高,但库比较少,开发周期长。多用于追求效率的设备,如嵌入式等。语法不同。
虚函数/纯虚函数
1.虚函数的作用
虚函数的作用主要是为了实现多态,可以在基类中对函数进行声明,在子类中对函数进行重载。并且可以通过基类的指针调用与基类同名但不同功能的函数。
2.纯虚函数的作用
包含纯虚函数的类被称为抽象类,抽象类不能用于实例化对象。继承抽象类的子类必须对当中的纯虚函数进行重载
3.哪些函数不能是虚函数
构造函数:有了构造函数才有虚表指针,有了虚表指针才能调用虚函数。因此构造函数必须在虚函数之前调用。
内联函数:
静态函数:
友元函数:
普通函数:
二、结构体内存对齐问题?
三、指针和引用的区别
四、传递参数时的指针和引用?
七、指针数组、数组指针、指针函数、函数指针
八、new delete malloc free
九、new delete malloc free
十、new delete malloc free
十一、new delete malloc free
十二、new delete malloc free
十三、宏定义和函数
十四、宏定义和typedef
十五、变量声明和定义
十六、strlen和sizeof
十八、a和&a
十九到二十一、C++、python、C、Java的对比
二十二、struct和class
二十三、宏定义和const
二十五、顶层const和底层const
二十六、数组名和指针
二十七、final和override
二十八、拷贝初始化和直接初始化
二十九、初始化和赋值
三十、extern C
三十一、野指针和悬空指针
三十二、C和C++的类型安全
三十三、重载、重写、隐藏的区别
三十四、C++的几种构造函数
三十五、浅拷贝和深拷贝的区别
三十六、内联函数和宏定义的区别
三十七、类的访问权限和继承权限
三十八、大小端存储
三十九、volatile、mutable和explicit关键字的用法
四十、什么情况下会调用拷贝构造函数
四十一、new
四十二、异常处理
四十五、形参和实参
四十六、值传递、指针传递、引用传递的区别和效率
四十七、静态变量什么时候初始化
四十八、const关键字的作用有哪些
四十九、类的继承
五十、从汇编层解释引用
五十一、深拷贝和浅拷贝
五十二、new和malloc
53、delete p、delete [] p、allocator都有什么作用?
54、new和delete的实现原理, delete是如何知道释放内存的大小的?
55、malloc申请的存储空间能用delete释放吗?
56、malloc与free的实现原理?
57、malloc、realloc、calloc的区别
58、类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表 会快一些?
59、有哪些情况必须用到成员列表初始化?作用是什么?
60、C++中新增了string,它与C语言中的 char *有什么区别吗?它是如何 实现的?
61、什么是内存泄露,如何检测与避免
62、对象复用的了解,零拷贝的了解
63、介绍面向对象的三大特性,并且举例说明
64、成员初始化列表的概念,为什么用它会快一些?
65 、 C++ 的 四 种 强 制 转 换 reinterpret_cast/const_cast/static_cast /dynamic_cast
66、C++函数调用的压栈过程
67、写C++代码时有一类错误是 coredump ,很常见,你遇到过吗?怎么 调试这个错误?
68、说说移动构造函数
69、C++中将临时变量作为返回值时的处理过程
70、如何获得结构成员相对于结构开头的字节偏移量
71、静态类型和动态类型,静态绑定和动态绑定的介绍
72、引用是否能实现动态绑定,为什么可以实现?
73、全局变量和局部变量有什么区别?
74、指针加减计算要注意什么?
75、 怎样判断两个浮点数是否相等?
76、方法调用的原理(栈,汇编)
77、C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道 吗?
78、类如何实现只能静态分配和只能动态分配
79、如果想将某个类用作基类,为什么该类必须定义而非声明?
80、 继承机制中对象之间如何转换?指针和引用之间如何转换?
81、知道C++中的组合吗?它与继承相比有什么优缺点吗?
82、函数指针?
83、说一说你理解的内存对齐以及原因
84、 结构体变量比较是否相等
85、 函数调用过程栈的变化,返回值和参数变量哪个先入栈?
86、define、const、typedef、inline的使用方法?他们之间有什么区别?
87、你知道printf函数的实现原理是什么吗?
88、为什么模板类一般都是放在一个h文件中
89、C++中类成员的访问权限和继承权限问题
90、cout和printf有什么区别?
91、重载运算符
92、当程序中有函数重载时,函数的匹配原则和顺序是什么?
93、定义和声明的区别
94、全局变量和static变量的区别
95、 静态成员与普通成员的区别是什么?
96、说一下你理解的 ifdef endif代表着什么?
97、隐式转换,如何消除隐式转换?
98、C++如何处理多个异常的?
99、如何在不使用额外空间的情况下,交换两个数?你有几种方法
100、你知道strcpy和memcpy的区别是什么吗?
101、程序在执行int main(int argc, char *argv[])时的内存结构,你了解 吗?
102、volatile关键字的作用?
103、如果有一个空类,它会默认添加哪些函数?
104、C++中标准库是什么?
105、你知道const char* 与string之间的关系是什么吗?
106~135、
内存管理
一、类的存储空间?
1.空类占用1个字节(不同编译器不同)
2.类的成员函数(除虚函数)不占用空间
3.类的静态成员变量不占用空间
4.虚函数占用8个字节(不管几个虚函数都只占用8个字节)
因此只需要计算各个变量(非静态成员)占用的空间和虚函数的空间。
二、C++的内存分区
1.栈区:由操作系统控制,存放局部变量,是连续的固定大小的内存,地址由高到低,分配效率比较高,可以动态分配和静态分配。
(机理:由一个链表记录空闲内存块的地址,申请时需要遍历链表,找到第一个大于申请空间的内存块。访问时需要先访问地址在访问内存。)
2.堆区:由程序员分配和释放,是不连续的内存,空间大小要大于栈区,地址由低到高,分配效率略低,只能动态分配,可能会产生碎片。
3.全局/静态存储区:存储全局变量和静态变量。
4.常量区:存储常量,不允许修改。
5.代码区:存储二进制代码。
三、什么是内存池,如何实现?
六、关于this指针
七、关于this指针
八、内存泄漏的后果?如何检测?解决方法?
九、delete this
十、delete this
十一、delete this
十四、this指针
C++11新标准
1、C++ 11有哪些新特性?
2、auto、decltype和decltype(auto)的用法
3、C++中NULL和nullptr区别
4、智能指针的原理、常用的智能指针及实现
5、说一说你了解的关于lambda函数的全部知识
6、智能指针的作用
7、说说你了解的auto_ptr作用
8、智能指针的循环引用
9、手写实现智能指针类需要实现哪些函数?
10、智能指针出现循环引用怎么解决?
其他问题
1、C++的多态如何实现
2、为什么析构函数一般写成虚函数
3、构造函数能否声明为虚函数或者纯虚函数,析构函数呢?
4、基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间
5、模板函数和模板类的特例化
6、构造函数、析构函数、虚函数可否声明为内联函数
7、C++模板是什么,你知道底层怎么实现的?
8、构造函数为什么不能为虚函数?析构函数为什么要虚函数?
9、析构函数的作用,如何起作用?
10、构造函数和析构函数可以调用虚函数吗,为什么
11、构造函数、析构函数的执行顺序?构造函数和拷贝构造的内部都干了 啥?
12、虚析构函数的作用,父类的析构函数是否要设置为虚函数?
13、构造函数析构函数可否抛出异常
14、构造函数一般不定义为虚函数的原因
15、类什么时候会析构?
16、构造函数或者析构函数中可以调用虚函数吗
17、构造函数的几种关键字
18、构造函数、拷贝构造函数和赋值操作符的区别
19、拷贝构造函数和赋值运算符重载的区别?
20、什么是虚拟继承
21、什么情况会自动生成默认构造函数?
22、抽象基类为什么不能创建对象?
23、模板类和模板函数的区别是什么?
24、多继承的优缺点,作为一个开发者怎么看待多继承
25、模板和实现可不可以不写在一个文件里面?为什么?
26、将字符串“hello world”从开始到打印到屏幕上的全过程?
27、为什么拷贝构造函数必须传引用不能传值?
28、静态函数能定义为虚函数吗?常函数呢?说说你的理解
29、虚函数的代价?
30、说一说你了解到的移动构造函数?
31、 什么时候合成构造函数?都说一说,你知道的都说一下
32、那什么时候需要合成拷贝构造函数呢?
33、构造函数的执行顺序是什么?
34、一个类中的全部构造函数的扩展过程是什么?
35、哪些函数不能是虚函数?把你知道的都说一说