const 和 static的用法及作用

来源:互联网 发布:php视频解析源码 编辑:程序博客网 时间:2024/05/17 03:07
一、const:

1、类中某个数据成员是const,表示这个数据成员不能被直接修改,但是可以间接修改,并且数据成员是不允许在类里定义时初始化,必须在构造函数的初始化列表中进行初始化。

2、函数成员的参数通常是使用引用的,表示用的是源头的数据;如果不希望破坏数据,则需要定义成const。通常情况下,函数成员的参数const和引用联合使用,以保证数据不被破坏;

3、(1)常量成员函数 :const int fun(void);这不是常量函数,仅仅表示该函数的返回值为常量;

(2)int fun(void)const:这个常量函数与int fun(void)构成重载关系;

构成重载的原因是:在常量函数中的第一个参数被隐藏,类中成员函数的第一个参数this指针被隐藏,普通成员函数的指针是普通指针,常量成员函数的this指针是常量指针。


4、C++中const的作用:

  (1)const用于定义常量:const定义的常量编译器可以对其进行数据静态类型安全检查。

  (2)const修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型时,将“值传递”改为“const&传递”可以提高效率。

  (3)const修饰函数的返回值:如果给“指针传递”的函数返回值加上const,则返回值不能被直接修改,且该返回值只能被赋值给const修饰的同类型指针。

  (4)const修饰类的成员函数(函数定义体):任何不需要修改数据成员的函数都应该使用const修饰,这样即使不小心修改了数据成员或调用了非const成员函数,编译器也会报错。

5、const与#define的区别:

(1)用#define M 12定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,#define所定义的宏变量在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;

(2)用const float M = 12; 定义的常量有类型名字,存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝,而#define 所定义的宏变量却有多个拷贝,所以宏定义在程序运行过程中所消耗的内存要比const变量的大得多;

(3)用#define定义的常量是不可以用指针变量去指向的,用const定义的常量是可以用指针去指向该常量的地址的;

(4)用#define可以定义一些简单的函数,const是不可以定义函数的.

二、static:

1、静态全局变量和普通全局变量:主要区别在于作用域不同,全局变量作用于整个工程,也就是整个工程中的不同文件可以共享全局变量,而静态全局变量的作用域只在当前的源文件中,其他源文件无法访问到;静态全局变量和普通全局变量都存放在全局数据区,如果没有初始化,默认值为0;

2、静态局部变量和普通局部变量:主要区别在于存储位置不同,静态局部变量存放在全局数据域,但其作用域还是局部的,不会因为某个子函数的完成而释放内存空间;普通局部变量是存放在堆栈中的,函数执行完毕后自动释放空间;他们的默认初始值也不同,静态局部变量的初始值为0,普通局部变量的初始值是随机值。

3、静态函数和普通函数,主要区别与静态全局变量和普通全局变量类似,静态函数的作用域是当前源文件,普通函数的作用域是整个工程。

4、静态成员函数可以被该类的所有对象直接访问;

静态成员函数本身只能访问静态成员,不可以访问非静态成员。

5、C++中使用static的作用:

(1)在函数体找那个,一个被声明为静态的变量在函数被调用的过程中维持其值不变。

(2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问。它是一个本地的全局变量。

(3)在模块内,被声明为静态的函数只能被这一模块内的其他函数调用。即函数被限制在声明它的模块范围内。






1 0
原创粉丝点击