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是自动计算的;