C++基础知识
链接:https://www.zhihu.com/question/23933514/answer/1949920314
1、面向对象的三大特性:封装、继承、多态
2、类的访问权限:private、protected、public
3、类的构造函数、析构函数、赋值函数、拷贝函数
class MyClass { private: int mx; int my; int mz; public: MyClass(int x,int y,int z):mx(x),my(y),mz(z) { //使用初始化列表的构造函数 } };
4、移动构造函数与拷贝构造函数对比
参考自:
C++ 移动构造函数和拷贝构造函数_Shrimp_millet-CSDN博客_拷贝构造函数和移动构造函数
c++中拷贝构造函数,浅拷贝和深拷贝的区别,以及移动构造函数总结 - 月光下的脚步 - 博客园 (cnblogs.com)
拷贝构造函数和移动构造函数 - 简书 (jianshu.com)
拷贝构造函数具有一般构造函数的所有特性,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类对象,即完成本类对象的复制。
class A(A& B) { }
5、深拷贝与浅拷贝的区别
6、空类有哪些函数?空类的大小?
7、内存分区:全局区、堆区、栈区、常量区、代码区
8、C++与C的区别
9、struct与class的区别
10、struct内存对齐
11、new/delete与malloc/free的区别
参考博客:C++中,new/delete和malloc/free的区别 - 李涛的技术博客 - 博客园 (cnblogs.com)
(1)new/delete是C++的操作符,而malloc/free是C中的函数
(2)new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配内存。
(3)new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针;new出来的指针是带有类型信息的,而malloc返回的是void指针。
(4)new/delete是保留字,不需要头文件支持;malloc/free需要头文件函数支持。
12、内存泄露的情况
13、sizeof与strlen对比
14、指针与引用的区别
参考博客:浅谈C++中指针和引用的区别 - Matrix海子 - 博客园 (cnblogs.com)
a.指针和引用的定义和性质的区别:
(1)指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用是原变量的一个别名。
int a=1;int *p=&a;//指针变量p指向a的存储单元 int a=1; int &b=a;//a和b是同一个东西,在内存中占用同一个存储单元
(2)可以有const指针,但是没有const引用
(3)指针可以有多级,但是没有const引用
(4)指针的置可以为空,但是引用在定义时必须初始化
(5)指针的值在初始化后可以改变,即指向其它的内存单元,而引用在进行初始化后就不会再改变了。
(6)”sizeof引用“得到的是所指向的对象的大小,而“sizeof指针”得到的是指针本身的大小。
b.指针作为参数进行传递时的区别
(1)用指针传递参数,可以实现对实参进行改变的目的。
void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 1; int b = 2; swap(a, b); cout << "a:" << a << " " << "b:" << b<<endl; }
(2)将引用作为函数的参数进行传递。
在讲引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。
15、野指针产生与避免
参考文章:【C++学习笔记】什么是野指针?如何避免它的出现? - 知乎 (zhihu.com)
指向非法的内存地址指针叫作野指针,意味着无法正常使用的指针。出现野指针的常见情形。
- 使用未初始化的指针
#include <iostream> usingnamespacestd; intmain() { int* p; cout<<*p<<endl; //编译通过,运行时出错 }
- 指针所指向的对象已经消亡
#include <iostream> using namespace std; int* retAddr() { int num = 10; return & num; } int main() { int* p = NULL; p = retAddr(); cout << &p << endl; cout << *p << endl; }
- 指针释放后未置空
指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。对指针进行free和delete,只是把指针所指的内存空间给释放掉,但并没有把指针本身置空,此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生野指针。
如何避免野指针的出现
- 引入引用机制,因为引用在定义的时候,必须初始化,所以可以避免也指针的出现。
- 如果定要使用指针,那么需要在定义指针变量的同时对它进行初始化操作,定义时将其置为NULL或指向一个有名变量。
- 对指针进行free或者delete操作后,将其设置为NULL。对于使用free的情况,用xfree来代替free置空指针。
16、多态:动态多态、静态多态
17、虚函数实现动态多态的原理、虚函数与纯虚函数的区别
18、继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?
19、静态多态:重写、重载、模板
20、static关键字:修饰局部变量、全局变量、类中成员变量、类中成员函数
21、const关键字:修饰变量、指针、类对象、类中成员函数
22、extern关键字:修饰全局变量
23、volatile关键字:避免编译器指令优化
24、四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
25、右值引用
26、std::move函数
27、四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr
28、shared_ptr中的循环引用怎么解决?(weak_ptr)
29、vector与list比较
C++ vector和list的区别 - 迪米特 - 博客园 (cnblogs.com)
vector和数组类似,拥有一段连续的内存空间,并且起始地址不变,能够进行高效的随机存取。
list是由双向链表实现的,因此内存空间是不连续的,能够进行高效地进行插入和删除。
30、vector迭代器失效的情况
31、map与unordered_map对比
32、set与unordered_set对比
33、STL容器空间配置器