您的位置:首页 > 其它

const和static的作用以及区别

2016-04-16 15:21 901 查看

Static:

存储方式:

定义一个static变量时,编译器会在静态存储区为它分配空间,而不是在栈上。

1. static变量如果声明在函数体中,它的作用范围是整个函数体。 需要注意它只会分配一次内存。所以多次调用这个函数不会多次给static变量重新赋值。因此它的值会保持上次调用时的值。

2. static变量如果声明在模块中,它的作用范围是这个模块中的所有函数。它可以被这个模块中所有函数访问,但是不能被模块外的函数访问。

3. static函数如果声明在模块中,那么它只能被这个模块中的所有函数调用,不能被模块外的函数调用。

4. 类中的static变量属于整个类,所以对于这个类的所有对象来说,它只有一份。也即所有对象共用这个变量。

5. 类中的static函数属于整个类,static函数不接受this指针,static函数只能访问类中的static变量以及调用static函数。

对于类的好处:

1.static变量对于所有这个类的对象都可以使用,也就是说创建了一个可以用于对象之间交流的变量。(全局变量也能实现这个功能。但是缺点如第二条)

2. static变量同时保证了封装性问题,也就是只有这个类的内部成员才能访问,而外部成员不能访问。全局变量虽然能实现变量之间的交流,但是它缺破坏了封装性的问题。它可以被任意的函数访问。

Const:

const的起源<转http://blog.sina.com.cn/s/blog_7e4386830100ug2j.html >:

c++中为什么会引入const

  c++的提出者当初是基于什么样的目的引入(或说保留)const关键字呢?,这是个有趣又有益的话题,对理解const非常有帮助。

1. 

大家知道,c++有一个类型严格的编译系统,这使得c++程式的错误在编译阶段即可发现许多,从而使得出错率大为减少,因此,也成为了c++和c相比,有着突出好处的一个方面。

2. c中非常常见的预处理指令 #define variablename variablevalue 能非常方便地进行值替代,这种值替代至少在三个方面好处突出:

  一是避免了意义模糊的数字出现,使得程式语义流畅清晰,如下例:

  #define user_num_max 107 这样就避免了直接使用107带来的困惑。

  二是能非常方便地进行参数的调整和修改,如上例,当人数由107变为201时,进改动此处即可, 

  三是提高了程式的执行效率,由于使用了预编译器进行值替代,并不必为这些常量分配存储空间,所以执行的效率较高。

  鉴于以上的好处,这种预定义指令的使用在程式中随处可见。

3. 说到这里,大家可能会迷惑上述的1点、2点和const有什么关系呢?,好,请接着向下

看来:

  预处理语句虽然有以上的许多好处,但他有个比较致命的缺点,即,预处理语句仅仅只是简单值替代,缺乏类型的检测机制。这样预处理语句就不能享受c++严格类型检查的好处,从而可能成为引发一系列错误的隐患。

4.好了,第一阶段结论出来了:

结论: const 推出的初始目的,正是为了取代预编译指令,消除他的缺点,同时继承他的好处。

目前他的形式变成了:

const datatype variablename = variablevalue ;

为什么const能非常好地取代预定义语句? 

const 到底有什么大神通,使他能振臂一挥取代预定义语句呢?

1. 首先,以const 修饰的常量值,具有不可变性,这是他能取代预定义语句的基础。

2. 第二,非常明显,他也同样能避免意义模糊的数字出现,同样能非常方便地进行参数的调整和修改。

3. 第三,c++的编译器通常不为普通const常量分配存储空间,而是将他们保存在符号表中,这使得他成为一个编译期间的常量,没有了存储和读内存的操作,使得他的效率也非常高,同时,这也是他取代预定义语句的重要基础。这里,我要提一下,为什么说这一点是也是他能取代预定义语句的基础,这是因为,编译器不会去读存储的内容,如果编译器为const分配了存储空间,他就不能够成为一个编译期间的常量了。

4. 最后,const定义也像一个普通的变量定义相同,他会由编译器对他进行类型的检测,消除了预定义语句的隐患。

const的使用:

1. 当你需要一个定义以后就不会再改变的变量时,就可以使用const关键字。一般const变量在定义时就要初始化。

2. 对于指针来说,有两种情况,

可以定义这个指针不能改变  如 int *const a = xxx;    即指针a不能改变,但是*a可以改变,也即a指向的内存地址。

可以定义这个指针指向的变量不能改变。 如 int const *a, 即*a不能改变, a可以改变。

3.  当const变量作为一个形参传入函数时,表明这个变量在函数中不能被改变。

4. 在类中,一个const函数表明,这个函数不能对这个类的成员变量进行修改, 如果需要允许对某个特定成员变量可以修改,则可以在这个变量前加上 mutable。

5. 在类中,一个返回值类型为const的函数代表,这个函数的返回值不能是“左值”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  const和static