广告

原创 const-static-extern-volatile的用法详解

2009-9-29 22:06 3205 0 分类: 软件与OS

1const的用法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


为什么使用const


解答:因为(1) 采用符号常量写出的代码更容易维护;(2) 指针常常是边读边移动,而不是边写边移动;(3) 许多函数参数是只读不写的。


const有什么用途?


解答:(1) 可以定义const常量;(2) const可以修饰函数的参数、返回值及函数的定义体,被const修饰的东西都受到强制保护,可以预防意外地修改,能提高程序的健壮性。


const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)


用法1:常量


取代了C中的宏定义,声明时必须进行初始化。const限制了常量的使用方式,并没有描述常量应该如何分配。如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。用const声明的变量虽然增加了分配空间,但是可以保证类型安全。C标准中,const定义的常量是全局的,C++中视声明位置而定。


用法2:指针和常量


使用指针时涉及到两个对象:该指针本身和被它所指的对象。将一个指针的声明用const“预先固定将使那个对象而不是使这个指针成为常量。要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。所以出现在 * 之前的const是作为基础类型的一部分:


char *const cp;  // charconst指针


char const *pc1;  // const char的指针


const char *pc2; // const char的指针(后两个声明是等同的)


用法3const修饰函数传入参数


将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。


通常修饰指针参数和引用参数:


void Fun( const A *in); // 修饰指针型传入参数


void Fun(const A &in);  // 修饰引用型传入参数


用法4:修饰函数返回值


可以阻止用户修改返回值。返回值也要相应的赋给一个常量或常指针。


用法5const修饰成员函数


const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数;const对象的成员是不能修改的,而通过指针维护的对象却是可以修改的;const成员函数不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。


2static的用法


静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。


用法1:函数内部声明的static变量,可作为对象间的一种通信机制


如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在执行线程第一次到达它的定义时初始化。


用法2:局部静态对象


对于局部静态对象,构造函数是在控制线程第一次通过该对象的定义时调用。在程序结束时,局部静态对象的析构函数将按照他们被构造的相反顺序逐一调用,没有规定确切时间。


用法3:静态成员和静态成员函数


如果一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个static静态成员。一个static成员只有唯一的一份副本,而不像常规的非static成员那样在每个对象里各有一份副本。同理,一个需要访问类成员,而不需要针对特定对象去调用的函数,也被称为一个static成员函数。类的静态成员函数只能访问类的静态成员(变量或函数)。


3extern的用法


extern可以声明其他文件内定义的变量。在一个程序里,一个对象只能定义一次,它可以有多个声明,但类型必须完全一样。如果定义在全局作用域或者名字空间作用域里某一个变量没有初始化,它会被按照默认方式初始化。


将变量或函数声明成外部链接,即该变量或函数名在其它函数中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。


extern “C” 声明语句


extern “C” { 声明语句块 }


extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量。


static 表示静态的变量,分配内存的时候,存储在静态区,不存储在栈上面。static 作用范围是内部连接的关系,和extern有点相反,它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,而static 不可以,只允许对象本身用它。


4volatile的用法


类型修正符(type-modifier),限定一个对象可被外部进程(操作系统、硬件或并发进程等)改变。volatile与变量连用,可以让变量被不同的线程访问和修改。


声明时语法:


int volatile vInt;


常用于像中断处理程序之类的异步进程进行内存单元访问。除了基本类型外,对用户定义类型也可以用volatile类型进行修饰。


注意:可以把一个非volatile int赋给volatile int,但是不能把非volatile对象赋给一个volatile对象。一个有volatile标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。用户只能用const_cast来获得对类型接口的完全访问。此外,volatileconst一样会从类传递到它的成员。

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
gujunyi1_407560534 2011-03-22 16:43
NP0,X5R,X7R,Y5V释义及其用途
这个是按美国电工协会(EIA)标准,根据不同介质材料而分类。这类参数描述了电容采用的电介质材料类别,温度特性以及误差等参数,不同的值也对应着一定的电容容量的范围。具体来说,就是:X7R常用于容量为33...
gujunyi1_407560534 2011-03-22 16:29
转贴:电容的选型
从电子产品的设计到采购来看,无源元件只是一个配角,其在整个电子产品中所占的物料成本仅约一成,但电子产品中的无源元件数量却是最多的。以电容为例,从2G发展到3G,仅一部手机中的MLCC数量就从平均165...
gujunyi1_407560534 2011-01-28 12:34
手把手将你用PADS Layout 2007.2生成Gerber文件
        本文主要讲述如何利用PADS 2007.2 Layout生成Gerber文件,由于内容较多,所以不再一一列出,这里仅贴出里面第一页的内容,总共14页。需要的博友们可以下载后观看,如有问...
gujunyi1_407560534 2011-01-12 16:10
DxDesigner的两个使用技巧-你一定用得着,而且很有帮助
...
gujunyi1_407560534 2010-11-22 13:47
VCC、VDD、VEE、VSS释疑汇总
在电子电路中,常可以看到VCC、VDD和VSS三种不同的符号,它们有什么区别呢?1、解释VCC:C=Circuit 表示电路的意思,即接入电路的电压;VDD:D=Device 表示器件的意思,即器件内...
gujunyi1_407560534 2010-11-17 12:23
晶体振荡器专题介绍
1、晶振的作用       晶振是晶体振荡器的简称,分为有源晶振和无源晶振两种,有源晶振无需外接匹配电容,只要加电即可输出一定频率的周期波形,所以有源晶振一般是四个引脚;无源晶振严格来说不能叫晶振,只...
我要评论
0
0
广告
关闭 热点推荐上一条 /1 下一条