const:是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。
他的主要优点有:(1)可以定义const常量,具有不可变性 //const int max = 100;max++会产生错误
(2)const修饰的常量,在程序中只有一份拷贝,比较#define定义的常量,它更节省空间和内存
(3)const修饰的常量,不是分配在内存中,而是放在符号表中,所以也没有了存储和读内存,效率更高。
int con_int = 4;
int tmp_int = 6;
//1. const int* ptr_int
const int* ptr_int = &con_int;
//*ptr_int = *ptr_int + 1; //因为const限定的是int* 所以ptr_int(int *)是const类型,不能修改
//*ptr_int = *(ptr_int + 1); //同理
con_int++;
//*ptr_int = tmp_int; //因为类似于上面,修改const int* 类型的ptr_int ,错误
ptr_int++;
ptr_int = &tmp_int;
//2 int* const ptr_int
int* const ptr_int = &con_int; //首先定义了ptr_int 是const
*ptr_int = *ptr_int+1; //而这里是int* 类型的赋值,允许,
*ptr_int = *(ptr_int+1); //ptr_int所存储的内容修改,允许
con_int++; //与ptr_int无关,允许
(*ptr_int)++; //int*类型的修改,与ptr_int无关,允许
ptr_int = &tmp_int; //改变ptr_int指向, 而ptr_int是const,所以不允许
system("pause");
const的使用场景有以下几个:
1.在函数的参数列表中
void test_const(const char* str){
str[0] = 'b';
}
int main()
{
char str[2] = {0};
test_const(str);
system("pause");
}
//错误类型:error C2166: 左值指定 const 对象
因为在传递str中,因为在函数参数传递时定义的时const char* 类型的str str[0]等价于 *(str+0)不能修改,
所以在函数传参时定义为对应类型的const 可以防止在函数体内被意外修改,起到保护数据的作用。
2.修饰成员函数
#include <iostream>
using namespace std;
class Point{
public :
Point(int _x):x(_x){}
void testConstFunction(int _x) const{
///错误,在const成员函数中,不能修改任何类成员变量
x=_x;
///错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
modify_x(_x);
}
void modify_x(int _x){
x=_x;
}
int x;
};
这里注意const 成员函数只能调用const成员函数
3.const修饰的函数返回值
const int * mallocA(){ ///const data,non-const pointer
int *a=new int(2);
return a;
}
int main()
{
const int *a = mallocA();
///int *b = mallocA(); ///编译错误
return 0;
}
//如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指 //针指向的数据是常量不能修改。
//如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没 // 有任何价值。所以,对于值传递来说,加const没有太多意义。
//所以:
// 不要把函数int GetInt(void) 写成const int GetInt(void)。
// 不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。
const内容参考http://www.cnblogs.com/xudong-bupt/p/3509567.html
二、static关键字
static分为C/C++中的使用,首先说static在C语言中的用法及特点
该变量在全局数据区分配内存,未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);
1.静态全局变量,若是创建了一个普通全局变量,那么在一个项目的各个文件中,这个变量名都是表示同一个变量,而在添加了staic静态全局变量,那么在一个项目中的某个文件创建的全局静态变量,在其他文件中不能访问,而定义相同变量名不会发生冲突,
2.静态局部变量:特点是在全局数据区分配内存,静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;所以在一个函数体中,若想返回一个有效的数据(保证在第二次调用函数保证函数中的局部值更新)可以添加static修饰,它就是存储在全局数据区,而它的作用域只在函数中有效
3.静态函数:
在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
静态函数的例子:
定义静态函数的好处:
静态函数不能被其它文件所用;
其它文件中可以定义相同名字的函数,不会发生冲突;
C++中static关键字
静态函数:没有this指针,每个该类对象调用同一静态函数,静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
三、extern关键字
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。通过这种行为它告诉编译器:该变量/函数的定义已经存在在某个地方了,让编译器到其他的模块去寻找它的定义。
另外,extern也可用来进行链接指定。
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。通过这种行为它告诉编译器:该变量/函数的定义已经存在在某个地方了,让编译器到其他的模块去寻找它的定义。
另外,extern也可用来进行链接指定。