const static externde

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也可用来进行链接指定。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值