1.由于静态成员函数不属于某个特定的对象,因此。不能像一般的成员函数那样随意的访问对象中的非静态数据成员。只能引用类中声明的静态数据成员。如果要引用非静态数据成员,可通过对象引用。
F
在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。
编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
普通成员变量占用对象的内存,静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。
普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。
静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
2.指向对象数组的指针不一定必须指向数组的首元素。
T
3.静态成员的特点是不管这个类创建了多少个对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象共享,或者说静态成员为类所有。
T
普通成员变量每个对象有各自的一份,而静态成员变量只有一份,被所有同类对象共享。
普通成员函数一定是作用在某个对象上的,而静态成员函数并不具体作用在某个对象上。
访问普通成员时,要通过对象名.成员名
等方式,指明要访问的成员变量是属于哪个对象的,或要调用的成员函数作用于哪个对象;访问静态成员时,则可以通过类名::成员名
的方式访问,不需要指明被访问的成员属于哪个对象或作用于哪个对象。因此,甚至可以在还没有任何对象生成时就访问一个类的静态成员。
当然,非静态成员的访问方式(也即对象名.成员名
)其实也适用于静态成员,但效果和类名::成员名
这种访问方式没有区别。
使用 sizeof 运算符计算对象所占用的存储空间时,不会将静态成员变量计算在内。对上面的 CRectangle 类来说,sizeof(CRectangle) 的值是 8。
静态成员变量本质上是全局变量。一个类,哪怕一个对象都不存在,其静态成员变量也存在。静态成员函数并不需要作用在某个具体的对象上,因此本质上是全局函数。
设置静态成员的目的,是为了将和某些类紧密相关的全局变量和全局函数写到类里面,形式上成为一个整体。考虑一个需要随时知道矩形总数和总面积的图形处理程序,当然可以用全局变量来记录这两个值,但是将这两个变量作为静态成员封装进类中,就更容易理解和维护。
4.常成员函数可以引用对象的数据成员,但是不能更新数据成员,也不能调用该类中非常成员函数。
T
常成员函数可以引用const数据成员,也可以引用非const的数据成员;
const数据成员可以被const成员函数引用,也可以被非const的成员函数引用;
常成员函数不能调用另一个非const成员函数。
5.this 指针是调用对象的名称,而不是指向调用对象的指针的名称。
F
this指针不是调用对象的名称,而是指向调用对象的指针名称
6.在下面有关静态成员函数的描述中,正确的是()。
A.在静态成员函数中可以使用this指针
B.静态成员函数在类外定义时要用static前缀
C.静态成员函数只能在类外定义
D.在建立对象前,就可以为静态数据成员赋值
D
C++中规定,在建立对象前就可以为静态数据成员赋值。同时规定在静态成员函数中不能使用this指针;静态成员函数在类外定义时,不需要用static前缀;静态成员函数既可以在类内定义也可以在类外定义。
7.由于静态成员函数不属于某个特定的对象,因此。不能像一般的成员函数那样随意的访问对象中的非静态数据成员。只能引用类中声明的静态数据成员。如果要引用非静态数据成员,可通过对象引用。
T