【C++】--- static和const(面试常考)

static

首先,我们要明确static是静态关键字。在C语言和C++中,我们都会用到static关键字,并且对于static有不同的用法和作用。接下来我将就C语言和C++两个不同的编译环境分别对static关键字的用法和作用进行讲述。

1.C语言中

1、在C语言中,static关键字主要定义全局静态变量、局部静态变量、静态函数。

(1)定义全局静态变量:在全局变量前加上关键字static,该全局变量就变成了全局静态变量。有以下特点:

在(静态存储区)全局数据区分配内存,在整个程序运行期间一直有效。

如果未对其进行初始化,其默认值为0.

该变量在本文件内从定义开始到文件结束可见。(在其他文件内不可见)

注意:全局变量也保存在静态存储区;若未手动初始化,编译器也会为其自动初始化为0;但是,全局变量在整个工程内可见,静态全局变量只在定义的本文件内可见。

(2)定义局部静态变量:在局部变量前加上关键字static,该局部变量就变成了局部静态变量。有以下特点:

在(静态存储区)全局数据区分配内存。

如果未对其进行初始化,其将被隐式初始化为0.

始终驻留在静态存储区,知道程序运行结束。

其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之消失。

注意:局部变量作用域也为局部作用域,定义它的函数或语句块结束时,其作用域随之消失;但是局部变量在栈中分配内存;如未对其进行初始化,编译器将会给它赋随机值;局部变量会随着函数栈帧的释放而消失。

(3)定义静态函数:在函数的返回类型加上static关键字,函数就变成了静态函数。有以下特点:

静态函数只能在本源文件中使用。

在文件作用域中声明的inline函数(C++)默认为static。

使用静态函数可以在其他文件中定义同名的函数,而不用考虑会出现名字冲突或者冲定义的错误。

注意:static函数和普通函数的最大的区别在于作用域方面,static函数限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。同时static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

2.在C++中

2、在C++中static新增了两种作用:定义静态数据成员、静态函数成员。

(1)定义静态数据成员,有以下特点

在程序的全局数据区分配

在类外初始化。因为静态数据成员定义时要分配空间,所以不能在类中声明。(静态数据成员不可以用参数初始化表进行初始化操作,是因为初始化表是在定义对象的时候进行的利用了this指针进行操作)。

没有this指针。静态数据成员的存储空间不同于普通的数据成员,它不属于类的任何一个对象,是独立于对象存储的。

静态数据成员是属于一个类的而不是某一个对象,它是为该类所定义的所有的对象所共有。该类所定义的对象都可以引用该静态成员,并且值都是一样的 。

注意:类中的常数据成员只能通过构造函数的参数初始化表进行初始化,且一经赋初值,不能被修改;常数据成员是实例化对象的一部分,可以用this指针访问。静态数据成员是可以被修改的,而且可以被任何一个对象修改,修改后的值,可以被所有的对象共享。

(2)静态成员函数。有如下特点:

没有this指针。

静态成员函数属于一个类而不是一个对象。

静态成员函数不能访问非静态数据成员。(非静态数据成员属于特定的类实例,主要用于对静态数据成员进行操作)

注意:如果静态成员函数要引用非静态成员时,可以通过对象来引用。从中可以看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>。

3.static关键字作用

①函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时任然维持上次的值。
②在模块内的static全局变量可以被模块内(源文件.cpp)所有函数访问,但不能被模块外其他函数访问。
③在模块内的static函数只可以被这一模块内(源文件.cpp)的其他函数调用,这个函数的使用范围也被限制在声明它的模块内。
④在类中的static成员变量属于整个类所拥有的,对类的所有对象只有一份拷贝。
⑤在类的static成员函数属于整个类所拥有,这个函数不接受this指针,因而只能访问类的static成员变量。

const

1.const作用

①const常量不可变。
②欲阻止一个变量被修改,可以加const保护,增加程序健壮性。
③const便于类型检查,const有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而宏只对字符进行替换,没有类型安全检查,并且在字符替换时可能会产生意想不到的后果。
④const可以很方便的进行参数的调整和修改。防止以外的的修改,做到一变都不变,不变都不变。
⑤const可以节省空间,避免不必要的内存开销,const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define那样给出的立即数,所以const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干拷贝。
⑥consti提高了效率,编译器通常不为普通的const常量分配存储空间,而是将他们保存在符号中,这使得它成为编译器间的一个常量,没有了存储和读取操作,使得效率很高。

文章参自:https://blog.csdn.net/ifiwere/article/details/104459702?utm_source=app

原创文章 73 获赞 361 访问量 6万+

猜你喜欢

转载自blog.csdn.net/L19002S/article/details/105578586
今日推荐