extern和const关键字的作用

 、extern的作用:
a、声明一个外部变量。注意此刻声明时不能定义该变量。因为在c++里变量只能定义一次。这样做的好处是在其他文件里面可以使用,但此时必须申明它。如:在a文件中声明了 extern int i;在b文件中可以直接使用这个变量,此时可以声明extern int i 告诉编译器这个变量在其他文件中已经声明了。我们平时往往把声明和定义混淆了。往往都是在声明的时候就定义了,这只能在一个文件里面使用,此时的声明就是定于,不能在多个文件里使用同时使用该变量。要在多个文件使用同一个变量的话就可以使用extern来声明。这里还要注意extern和static的区别:extern是文件级的,也就是说多个文件(只要是声明了extern int i的)都可以使用同一个变量。而static只是在文件内部使用,它声明的变量的使用范围相当于是file scope,即在该cpp文件里都可使用, 在应用程序消亡的时候消亡。这里不得不提一下全局变量与前面两者的关系。这三个限制作用域的关键字的区别总的来说是这样的:全局变量,整个应用程序下的所有文件;extern,必须是在都声明的情况下使用同一个变量;static,在单个文件范围内使用。
b、用于c,C++之间互相调用函数时使用的。当C++想调用c编写的lib或dll里的文件里的函数时就要使用extern关键字。因为在编译后c和C++编译器多函数的处理方式是不一样的,C++为了重载机制的运行把函数名f()的形式改成了_f_int_int。前一个int是指的参数的个数,后一个int指的是返回值的类型。而c的处理是把函数的形式只转换成了_f。在c++函数中调用c函数的时候应该用extern 声明c里的函数,再用extern “c”声明c++里的函数;在c里调用c++的函数的时候在c++里声明extern "C" ,在c里声明extern。

2、const的使用
a、const 用于指针的两种情况分析:  int const *a;  file://a可变,*a不可变 ,int *const a;  file://a不可变,*a可变。const 是一个左结合的类型修饰符,它与其左侧的类型修饰符和为一个类型修饰符,所以,int const 限定 *a,不限定a。int *const 限定a,不限定*a。const 限定函数的传递值参数:void fun(const int var);分析:上述写法限定参数在函数体中不可被改变。由值传递的特点可知,var在函数体中的改变。不会影响到函数外部。所以,此限定与函数的使用者无关,仅与函数的编写者有关。结论:最好在函数的内部进行限定,对外部调用者屏蔽,以免引起困惑。const 限定函数的值型返回值:

const int fun1();

const myclass fun2();

 分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如fun1),已经是一个

数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。当函数返回自定义的

类型时(如fun2),这个类型仍然包含可以被赋值的变量成员,所以,此时有意义。

b. 传递与返回地址: 此种情况最为常见,由地址变量的特点可知,适当使用const,意义昭然。

c. const 限定类的成员函数:

class classname {

 public:

  int fun() const;

 .....

}

  注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中

均要使用const,因为const已经成为类型信息的一部分。

获得能力:可以操作常量对象。

失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值