关键字的简单总结:static、const、sizeof以及malloc和new、delete和free

static

一、限定全局变量的作用范围(隐藏)

1、函数体内的static变量作用范围为该函数体。

2、模块内的static函数只可被这一模块内的其它函数访问。

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

3、在类中的static成员变量、static成员函数属于整个类所有

二、保持变量内容的持久()

如果作为static局部变量在函数内定义,它的生存期为整个源程序,即变量值可以持久存在,但是只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

三、默认初始化为0

在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。

共有两种变量存储在静态存储区:全局变量和static变量。所以全局变量也具备这一属性。

const 限定符,它把一个对象转换成一个常量。

一、const与define。

两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些。#define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内联函数(Inline)。

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

二、const的使用

1、定义常量

const int a = 10;   //句1

int const a = 10;   //句2

句1和句2完全等价

2、与指针结合使用

2.1指针指向的内容不可修改,指针可以修改

const int *ptr = &value;   //句3

int const *ptr = &value;   //句4,由于没有const *运算 const修饰前面的int

2.2指针本身不可修改,即指针不可再指向其它内存

const (int*) ptr = &value;   //句5

(int*) const ptr = &value;   //句6

int* const ptr = &value;   //句7

2.3 句4和句7

int const *ptr = &value;   //指针指向内容不可变

int* const ptr = &value;   //指针本身不可变

三、const用于函数中

1、修饰函数的参数

void fun(const int a)   //a为形参,因此毫无意义

void fun(const int* a)   //参数指针指向的内容不可修改

void fun(int* const a)   //参数指针本身不可修改,无意义

以下两句等价:

void fun(const int &a)   //引用参数在函数内为常量不可修改

void fun(int const &a)   //引用参数在函数内为常量不可修改

2、修饰函数返回值

const int fun()   //调用函数:int a = fun(); ++a;没有意义

const int* fun()   //调用函数:const int* ptr = fun();可把fun()看做一个变量,即同句3指针指向内容不修改

int* const fun()   //调用函数:int* const ptr = fun();同句7指针本身不可修改

sizeof和strlen

一、sizeof是运算符,而strlen是函数

二、sizeof可以用类型做参数(sizeof(int)),也可以函数做参数(相当于以函数返回值类型为参数);strlen只能用char*做参数,而且必须是以“\0”为结尾

eg1.   char ss[] = "123456789";   sizeof(ss)结果为10(因为末尾还有一位存放"\0"),strlen(ss)为9(内部实现使用一个循环计算字符串的长度,到"\0"为止)

eg2.   int aa[100] = {0};   sizeof(aa)结果为400,strlen(ss)报错

三、数组做sizeof参数不退化,而传递给strlen时会退化为指针(因为strlen是函数)

四、在编译的时候sizeof就已经计算完成;strlen的结果则要在运行的时候才能计算出来,计算字符串的长度,而不是类型占内存的大小

五、sizeof后如果是类型必须加括号,而如果是变量名则可以不加括号,因为sizeof是运算符而不是函数

六、sizeof不能返回被动态分配的数组或外部的数组的尺寸

malloc和new、delete和free

一、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
二、对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存

简单的说:
malloc、free是c的函数;new、delete是c++的运算符;
new是强制类型的,malloc不是,需要类型转换;
new 可以调用构造函数在声明的时候初始化,malloc只是分配空间,需要在其他地方初始化;
delete不仅会释放空间,在释放前会调用析构函数;
malloc需要指定分配空间大小, 而new是自动计算的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值