2021.5.21
1、char、short、int占几个字节?char范围?
int:4个字节、short:2个字节、char:1个字节、char*:8个字节、long:8个字节、double(双精度浮点数):8个字节、float(单精度浮点数):4个字节;
char范围:-128~127(-2^7~2^7)
int范围:-2^31~2^31;
2、C++中static关键字
static常用的两个作用,一个是作用域限制,一个是生存期限制。
对函数来说:
作用域限制:被static修饰的函数,只能用于代码本身文件的调用。
生存期限制:对函数来说,这条是用来说类的静态成员函数的。在类对象出生前,类的静态成员函数就活着了。
C/C++共有
- 修饰全局变量时,表明一个全局变量只对定义在同一个文件中的函数可见;
- 修饰局部变量时,表明该变量的值不会因为函数终止而消失;
- 修饰函数时,表明该函数只在同一文件中调用;
- static修饰的变量默认初始化为0。包括未初始化的全局静态变量和局部静态变量,另外未初始化的全局变量也具备这一属性,因为未初始化的全局变量与未初始化的静态变量存储在同一区域内(BSS,全局(静态)存储区,BSS的特点是在程序执行之前BSS会自动清0)。
C++独有
- 修饰类的数据成员,表明该类所有对象这个数据成员只有这一个实例,该实例归所有对象所有。静态成员变量可以直接通过类名访问,也可以通过类的对象访问;静态成员变量单独分配在全局存储区;
- 修饰类的成员函数,类的静态成员函数只能访问类的静态成员变量和全局变量;类的静态成员函数没有this指针;如果要通过静态函数访问类的非静态成员变量,那么可以将类的对象作为参数传递给该静态函数,然后在静态函数中引用这个对象,并调用其动态方法。
问题:(1)在头文件把一个变量申明为static变量,那么引用该头文件的源文件能够访问到该变量吗。
答:可以。声明static变量一般是为了在本cpp文件中的static变量不能被其他的cpp文件引用,但是对于头文件,因为cpp文件中包含了头文件,故相当于该static变量在本cpp文件中也可以被见到。当多个cpp文件包含该头文件中,这个static变量将在各个cpp文件中将是独立的,彼此修改不会对相互有影响。
(2)为什么静态成员函数不能申明为const
答:这是C++的规则,const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall,而类中的static函数本质上是全局函数,调用规约是__cdecl或__stdcall,不能用const来修饰它。<span style="line-height:26px">一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。
(3)为什么不能在类的内部定义以及初始化static成员变量,而必须要放到类的外部定义
答:因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
(4)static关键字为什么只能出现在类内部的声明语句中,而不能重复出现在类外的定义中
答:如果类外定义函数时在函数名前加了static,因为作用域的限制,就只能在当前cpp里用,类本来就是为了给程序里各种地方用的,其他地方使用类是包含类的头文件,而无法包含类的源文件。这样就导致无法在其他地方调用这个静态的类成员函数。如果要解决这个办法,就是在头文件中加extern。然而extern和static是一对儿对立的关键字,不能用在一起。
(5)为什么常量静态成员数据的初始化可以放在类内(注意:只有静态常量整型数据成员才可以在类中初始化)
答:static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。 static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了。
(6)为什么静态成员函数只能访问静态成员变量。
答:1.静态成员函数只属于类本身,随着类的加载而存在,不属于任何对象,是独立存在