【C++知识点】(一)基础部分

目录

关键字部分

内存


学习并整理C++相关知识点,内容来自各种资料;

关键字部分

1、define宏定义:简单的 值替换,不进行类型检查。在预处理阶段展开

注意:#abc  表示 宏定义为 “abc”;

##作用是将宏定义的多个形参转换成一个实际参数名 num##5 ->num5

2、volatile关键字:其定义的变量可以随时被修改

1)修饰中断程序中可以被其他程序修改的变量

2)修饰多线程应用中被几个任务共享的变量

3)修饰并行设备的硬件寄存器,因为寄存器随时可以被外设硬件修改

3、static关键字:修饰的变量变成静态变量,函数变成静态函数

1、修饰变量在函数体内:只会被初始一次,在函数调用过程中变量值不变,生命周期与程序一样,存储在静态区。

2、修饰变量模块内(全局变量):被修饰的变量只能被类内(本文件)函数访问,改变了作用域

3、修饰函数在类内:只能被模块内的其他函数调用

4、extern "C" 就是实现C++代码调用C语言代码,这部分代码会按照C语言编译

5、const关键字:简单理解就是修饰的内容变成常量,常对象,修饰函数返回值(需要初始化)

注:常量指针 const int*p/int const *p ,即指针指向的内存可以改变,但是指向内存上的数值不能变

指针常量 int* const p 本身是一个常量,也就是说指向的内存不能变,但是内存里面的值可以改变

Tips:const和define的区别和优劣:

define是文本替换,生命周期止于编译期,也就意味着不能调用传递,但是const修饰的常量可以,并分配了空间,有数据类型,支持调试,可以提高程序的健壮性。

6、new/deletemalloc/free的区别?

new/delete是C++中的操作符,直接申请内存,返回值是指定类型的指针

malloc/free是库函数,不能够自动调用析构和构造函数,因此只能为变量申请和释放内存,需要给定内存大小,并在返回时强行转换成实际类型的指针

7、关于sezeof/strlen的区别?

sizeof是C语言中的关键字/运算符,是以字节的形式给出操作数的存储大小,参数类型可以是:类型、函数(返回值是int的值,一般32位下是4)。sizeof(str[20])=20  (char类型*20)

strlen是一个函数,一般在运行的时候计算,算的是字符串的实际长度,且必须以“\0”结尾.

str[20]="0123456789" strlen(str)=10;

补充常见类型字节长度:

8、srtuct和union区别:

struct 结构体:所有成员占用空间是累加的,所有成员都存在,不同成员占用不同的地址(因此内存空间等于所有成员长度之和,且需要考虑字节对齐),结构体成员赋值互不影响

union联合体:所有成员公用一块地址,占用空间是最长的成员的长度。赋值会对其他成员重写

9、左值:出现在等号左边的表达式或变量,特点:可写(可寻址),可以被修改

      右值:出现在等号右边的值或者表达式,特点:可读,使用完就会释放

10、Typedef 关键字:给数据类型定义新的名字,编译时处理,具有类型检查

11、auto 关键字:在C语言中修饰局部变量,表明该变量是自动变量函数结束后自动结束

                               C++中表示类型自动推断,由后面内容得出

12、explicit关键字:表示函数不允许隐式赋值。想让返回对象的函数不调用拷贝构造函数就在拷贝构造函数前面加explicit.

内存

1、内存四区:

堆区(需要及时释放,可能会存在内存泄露)

栈区(系统自动分配,临时区,函数调用完毕自动释放)

代码区(静态区):包括全局变量,静态变量,以及常量

全局区:主要是函数,全局区存放函数体的二进制代码,操作系统管理

2、堆栈相关问题

1。堆栈区别:

1)栈:系统自动分配和释放 堆:手动分配和释放

2)栈:在空间上有限制,由高地址向低地址扩展,连续的内存结构,不存在碎片问题

      堆:没有限制,低地址向高地址扩展,不连续的,大小一般受限于虚拟内存

3)效率:栈的效率较快,堆的效率较慢

2。为什么堆向上扩展,栈向下扩展:

个人理解:首先是两端向中间扩展有利于资源利用,因为每一个程序的堆栈大小是不确定的。

2、堆上的变量存储时间较长,按照常规高位放在高位,低位放在低位的习惯,由下向上比较合适,栈的话变量主要完成pop,push的操作,并不是很需要考虑地址问题。

TIPS:栈是多线程编程的基础,每个线程都至少有一个自己专属的栈。

3、C++中内存管理:

虚拟内存分为六个部分:代码段、数据段、BSS段、堆区、栈区、文件映射区

代码段:包括只读存储区和文本区(只读存储区是字符串常量,文本区存储程序机器代码)

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

BSS段:未初始化的全局变量和静态变量,以及初始化为0的全局变量和静态变量

堆区:手动分配的那部分内存

栈区:栈空间的局部变量,返回值、参数等

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

4、内存泄露:申请了一块空间,使用完毕后没有释放。申请了一块内存,但是没有指针指向他,就是内存泄漏。

如何避免:1、使用内存时候检查是否有内存泄漏、2、使用智能指针 3、避免在程序级别上申请内存

5、指针和引用:指针是指想内存,内容是所指内存的地址;引用是某块内存的别名。指针占用4个字节的内存,引用的本质是指针常量,指向的对象不能变,但是值可以变。

区别:指针是实体,引用是别名;引用(++)是对值,指针是对地址;引用只能在初始化的时候定义一次,指针是可以改变的;引用不能为空,指针可以为空。

6、野指针:指针创建但是没有初始化,指针被free或者delete没有将指针设置为null,指针越界都会出现野指针

避免的方法:初始化,释放后赋值;使用malloc函数分配内存后检查是否分配成功,清空内存中数据

7、智能指针:方便与管理堆内存。例如weak_ptr弱指针,可以检测管理的对象是否被释放,但是不会指向引用计数的共享内存。

8、#include<>和#include""的区别:前者是先从标准库中搜索,调用系统文件快;后者先从用户工作路径开始,调用自定义文件快

9、头文件作用:1)可以调用库2)可以增强类型检查,因为当使用时候与声明不一样,就会报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值