对const和static的理解

来源:互联网 发布:写真制作软件 编辑:程序博客网 时间:2024/06/08 00:59

上学期学c的时候,const和static就弄得不是很清楚,好像考试有道静态变量的选择题还纠结了好久~昨晚把小红书认真看了一遍,算是有了点头绪。梳理下。

1. const 

(1) 如果我们想定义一个变量,在初始化之后就不能更改它的值,那么只要将这个变量设置为const。const int i = 1  或 int const i = 1 两种写法都可以。初始化赋值之后,再对其进行修改就是非法的。

(2)在c++的class中我们对有const的情况进行讨论。首先,常对象。class Student ;  const Student s.酱紫定义一个学生类的常对象s,这样Student类中的数据成员就自动变成const变量,且这个对象对外界的唯一接口是const函数。只能通过 例如 void diaplay() const;这样的const成员函数来调用,对非const成员函数的调用是非法的。

(3)数据成员为const变量情况下,其值不能被修改。无论是const函数还是非const,只可以引用而不可修改它的值。

(4)成员函数为const的时候,对数据成员只能引用而不能修改。

(5)const成员函数不能调用非const函数,防止调用之后修改,失去了const的意义。

(6)常数据成员在初始化的时候不能用构造函数,只能通过初始化表的方式进行初始化。

总之,在非常对象的情况下,只要成员函数和数据成员有任意一方的属性为const,那么数据成员的值就不可以在函数中被修改。成员函数作为对外的借口。

2.static

静态。我们将静态变量放在内存的静态存储区。静态变量的空间不随函数或者作用域的结束而被释放,而是等到程序的结束,才会被释放。在c++中,我们将某些数据成员定义为static,目的是实现数据的共享。举个例子,ABC三个大学都是大学这个类中的实例化的对象,由于某种原因,需要ABC三所大学共建一个图书馆,我们在大学这个类中就可以将图书馆定义为静态成员变量,所有的大学类的对象共享图书馆这数据,但是,需要明确的是,静态数据成员不属于任何一个对象,是属于类的。额,有点难理解哈。图书馆这个数据并不放在任何对象自己的内存区域,而是放在另一块静态存储区,独立于任何对象,属于这个类。所以我们在初始化的时候,静态数据成员并不能在构造函数或者初始化表中初始化,应该在类外单独初始化。例如 University::library = xxx;这样。不过我们在使用static libraty这个静态数据成员的时候可以通过对象名+ . 来进行引用,需要注意的是,这里并不是属于某个对象的静态数据,而是使用了对象的类。准确地说,还是 University::library 这样。

静态成员函数。例如static void display();原则上静态成员函数是专门为了处理静态数据而定义的。由于静态成员函数不属于任何对象,也没有this指针,也不能直接对非静态数据成员进行访问。但是可以直接访问静态数据成员。(应该是在同类中的原因,逻辑上是在一起的)。通过对象名和类名访问静态成员函数都是可行的。同理,只是用了对象的类名来进行访问。另外,如果想在静态成员函数中对非静态数据成员访问,因为没有this指针,需要在在数据前加上对象,让数据成员知道是使用哪个对象的数据。

我们应该保证在静态成员函数中只处理静态数据成员,体现程序清晰的结构。

静态成员函数和非静态根本区别就是有没有this指针。~~OK,  Let's return 0!

0 0
原创粉丝点击