const、static、extern小结

来源:互联网 发布:3维设计软件 编辑:程序博客网 时间:2024/06/11 01:22

const

1.const修饰的只读变量

编译时,编译器提示错误,int b[a]这行:expected constant expression命名为.cpp文件,则没问题。原因是:在c中,常量表达式必须是编译期常量,a不是编译期常量(是运行期常量)。因为const int ac中不是常量表达式,因此不能用于定义数组。

2.节省空间,避免不必要的内存分配

#define M 3         //  宏常量

const int N=5;     //  此时N并未放入内存中

...

int i=N;                 //  此时为N分配内存,以后不再分配

int i=M;                 //  预编译期间进行宏替换,分配内存

int j=N;                 //  没有内存分配  

int j=M;                 //   再进行宏替换,又一次分配内存

const定义的只读变量在程序运行过程中只有一份拷贝(因为他是全局的只读变量,存放在静态区),而#define定义的宏变量在内存中。有若干个拷贝

3.修饰指针


4. 在定义函数时使用:

a) 作为参数使用,说明函数体内是不能修改该参数的:  

void func(const int a)

c) 在函数中使用const,情况与定义变量的情况基本一致:

const int func()

b) 作为返回值使用,说明函数的返回值是不能被修改的: 

C++中区别于Cconst用法

 1. const类成员

       const类成员在对象构造期间允许被初始化并且在以后不允许被改变。const类成员和一般的const 

量有所不同。const类成员是对应于每个对象而言,它在对象构造期间被初始化,在这个对象的生存周不允变。

    2. const 成员函数

 const 成员函数不允许在此函数体内对此函数对应的类的所有成员变量进行修改。Const一般放在函数体后。

functionType 数体后:  fun()   const 

    const成员函数应该在函数原型说明和函数定义中都增加const限定,非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员。

 3.const成员函数的使用
const成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义const成员函数时,把const关键字放在函数的参数表和函数体之间。




static

static主要有三个作用:

(1)局部静态变量

(2)外部静态变量/函数

     (3)静态数据成员/成员函数      //c++特有

一、局部静态变量

2. static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。

3. 对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符。(对于C++中的class对象例外,class的对象实例如果不初始化,则会自动调用默认构造函数,不管是否是static类型)

二、外部静态变量/函数

对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区,生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部。

三、静态数据成员/成员函数

C+ +重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最大区别,
也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例,
就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的,因此不可能属于某一个实例对象的. (针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )


extern

对变量而言,变量的声明有两种情况: 一种是需要建立存储空间的,不用加extern;2、另一种是不需要建立存储空间,需要加extern 。如果你想在本源文件中使用另一个源文件的变量,就需要在使用前用extern声明该变量,或者在头文件中用extern声明该变量;

对函数而言,如果你想在本源文件中使用另一个源文件的函数,就需要在使用前用声明该变量,声明函数加不加extern都没关系,所以在头文件中函数可以不用加extern。



0 0
原创粉丝点击