C++基础知识总结-3

一、隐式类型转换

首先,对于内置类型,低精度的变量给高精度的变量赋值是会发生隐式类型转换。其次,对于只存在单个参数的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象。

二、new/delete和molloc/free的区别

首先,new/delete是C++的关键字,而molloc/free是C语言的库函数,后者使用不许指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数。

三、fork、wait、exec函数

父进程产生子进程使用fock拷贝出来一个父进程的副本,此时只拷贝了父进程的页表,两个进程都读同一块内存,当有进程写的时候使用实拷贝机制分配内存。exec函数可以加载一个elf文件去替换父进程,从此父进程和子进程就可以运行不同的程序了。fork从父进程返回i子进程的pid,从子进程返回0。调用了wait的父进程将会发生阻塞,直到有子进程状态改变,执行成功返回0,错误返回-1。exec执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1。

四、重载和覆盖

重载:两个函数名相同,但是参数列表不同(个数,类型,顺序),返回值类型没有要求,在同一作用域中。

重写(覆盖):子类继承了父类,父类中的函数是虚函数,在子类中重新定义了这个虚函数,这种情况是重写。

五、C++中类成员的访问权限

C++通过public、protected、private三个关键字来控制成员变量和成员函数的访问权限,他们分别表示公有的、受保护的、私有的,被称为成员访问限定符。在类的内部(定义类的代码内部),无论成员被声明为什么,都是可以相互访问的,没有访问权限的限制;在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问public属性的成员,不能访问private和protected属性的成员,要想访问,必须通过公有成员函数进行访问。

六、C++中struct和class的区别

在C++中,可以用struct和class定义类,都可以继承。区别在于,struct的默认继承权限和默认访问权限是public,而class的默认继承权限和默认访问权限是private。另外,class还可以定义模板类形参,比如template<class T,int i>

七、左值引用和右值引用的区别

右值引用是C++11中引入的新特性,他实现了转移语义和精确传递。它的主要目的有两个方面:1、消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。2、能够更简洁明确地定义泛型函数。

左值和右值的概念:

左值:能对表达式取地址、或匿名对象/变量。一般只表达式结束后依然存在的持久对象。

右值:不能对表达式去地址,或匿名对象。一般指表达式结束就不再存在的临时对象。

右值引用和左值引用的区别:

  1. 左值可以寻址,而右值不可以。
  2. 左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。
  3. 左值可变,右值不可变(仅对于基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。

八、C++源文件从文本到可执行文件经历的过程

对于C++源文件,从文本到可执行文件一般需要四个过程:

1、预处理阶段:对源代码文本中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。

2、编译阶段:将经过预处理后的预编译文件转换成也得汇编代码,生成汇编文件。

3、汇编阶段:将编译阶段生产的汇编文件转换成机器码,生成可重定位目标文件。

4、链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件。

九、include头文件的顺序以及双引号""和尖括号<>的区别

1、include头文件的顺序:对于include的头文件来说,如果在文件a.h中声明一个在文件b.h中定义的变量,而不引用b.h。那么要在a.c文件中引用b.h文件,并且要先引用b.h,后引用a.h,否则汇报变量类型未声明错误。

2、双引号和尖括号的区别:编译器预处理阶段查找头文件的路径不一样。

对于使用双引号包含的头文件,查找头文件路径的顺序为:当前头文件目录->编译器设置的头文件路径->系统变量;

对于使用尖括号包含的头文件,查找头文件路径的顺序为:编译器设置的头文件路径->系统变量;

十、C++的内存管理

在C++中,虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区以及栈区六部分。

1、代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本存储区存储程序的机器代码;

2、数据段:存储程序中已初始化的全局变量和静态变量

3、BSS段:存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量。

4、堆区:使用new/molloc时在堆区动态分配内存,同时需要调用delete/free来手动释放申请的内存。

5、文件映射区:存储动态链接库以及调用mmap函数进行的文件映射。

6、栈区:使用栈空间存储函数的返回地址、参数、局部变量、返回值。

十一、如何判断内存泄漏

内存泄漏通常是由于调用了malloc/new等内存申请的操作,但是确实了对应的free/delete。为了判断内存是否泄露,我们一方面可以使用linux环节下的内存泄漏检查工具Valgrind,另一方面我们在写代码时可以添加内存申请和释放的统计功能,统计当前申请和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值