c++一些笔记(static,const,new/delete与malloc/free)

1.对static的理解

static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。

static作用:(1)隐藏:同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,在函数和变量前加static可以避免变量冲突与变量污染,即便是 extern 外部声明也不可以。。

(2)延长变量使用寿命:函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。

(3)默认初始化为 0:稀疏矩阵赋0。

2.对const的理解

C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。 const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助,如果不想让编译器察觉到上面到对 const 的操作,我们可以在 const 前面加上 volatile 关键字。

(1)修饰int型变量:

volatile const int  a = 7;

(2) 修饰指针型变量:

        1. const 修饰指针指向的内容,则内容为不可变量

const int *p = 8;

        2.  const 修饰指针,则指针为不可变量

            

int a = 8;
int* const p = &a;

        3.const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。 

3.C++里堆区和栈区的区别。

栈区:由编译器自动分配释放,速度较快,在WINDOWS下栈的大小是一个编译时就确定的常数,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于数据结构里的栈

堆区:一般由程序员分配释放(利用new/malloc),容易产生碎片,使用方便, 若程序员不释放,程序结束时可能由操作系统回收.类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的.一旦某一节点从链中断开,我们要人为的把所断开的节点从内存中释放.

4.new/delete与malloc/free区别 

 new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件cstdlib支持。

new:new告诉计算机开辟一段新的空间,并且存放在堆上,new产生的是一段空间的首地址。所以一般需要用指针来存放这段地址,创建的对象需要delete销毁

int *pi=new int;//初始化指针pi
int *pi=new int();//对指针pi指向的地址的值进行了初始化
int *pi=new int(1);//初始化为1
delete pi

 malloc:在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续,free只是释放了malloc所申请的内存,并不改变指针的值

int  a=10; 
int  *arr=(int *) malloc(sizeof (int)* a);

free(vert_x);

区别:1.new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件cstdlib支持。

         2.new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。

         3.new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。

         malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。

        4.使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。

        5.new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。

5.多态性与虚函数

多态性:相同的方法或者函数调用被不同的对象所接受时可能导致的不同行为的现象。多态可以分为两类

1.编译的多态性:指属于同类的不同对象,或不同环境下的同一对象,调用了名称相同的成员函数,所完成的功能却不相同,通过静态联编来实现,是一种静态多态性

2.运行多态性:指的是属于某个基类的不同派生对象,在形式上调用的是继承自己基类的同一成员函数。实际上调用的却是各自派生的同名成员函数,这是一种动态多态性,因为函数名,函数参数和返回类型,都相同的情况下,编译阶段不能确定要调用的函数,只能在程序运行时确定这种多态性,运行时的多态性主要是通过虚函数来实现的

虚函数:作用主要是实现多态的机制

6.内存分配:静态内存区分配,栈区分配,堆区创建

5.程序编译的过程

        1.预处理:以字符#开头的语句,修改为原始的c程序

        2.编译:编译器将预编译好的文件进一步翻译成保存汇编语言的文本

        3.汇编:汇编器将上述文件翻译成机器语言指令,并把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在新生成的二进制文件中

        4.链接:将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件

6.左值引用与右只引用

c++中的新概念,有名称。可取到地址的为左值,没有名称,不可取地址的为右值

 左值一定在内存中,右值有可能在内存中也有可能在寄存器中

引用:别名

int a=b;

其中a为左值,名称为a,&a可取到a的地址,b则没有这些特性

7.c++中重载(overload)和重写(override)的区别

重载:指同一类中的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

重写:子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现

区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中

          重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同

          重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有

8.动态库和静态库的区别

动态库:扩展名一般为(.so或.dll)当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用;可执行文件无法单独运行。更新时只要替换对应动态库即可,不必重新编译整个可执行文件

静态库:扩展名一般为(.a或.lib)在编译的时候会直接整合到目标程序中,编译成功的可执行文件可以独立运行,如果函数库更新,需要重新编译。 

9.虚函数和纯虚函数的区别

虚函数的定义形式:virtual{};纯虚函数的定义形式:virtual  { } = 0;

虚函数可以被直接使用,也可以被子类重载以后,以多态的形式调用,而纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类有声明而没有定义。

10.智能指针

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值