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容器空间配置器

posted @ 2022-02-16 22:08  HelloWorld庄先生  阅读(252)  评论(0编辑  收藏  举报