有关下面 C++ 代码的说法,正确的是( )。
using namespace std;
class newClass
{
public:
static int objCounter;
};
int newClass::objCounter = 2;
int main()
{
newClass classA;
newClass classB;
cout << newClass::objCounter << endl; // 第 14 行
cout << classB.objCounter << endl; // 第 15 行
}静态成员变量属于类,不属于对象,所有对象共享同一份数据。所以既可以通过类名访问,也可以通过任意对象访问,两行代码都合法。
很多考生看到第14行用类名访问会犹豫,以为静态成员必须通过对象访问;或者看到第15行用对象访问,又觉得静态成员不该通过对象访问。其实静态成员访问方式很灵活,只要语法合法就行。另外,第6行是初始化语句,不是赋值语句,不能改成+=1,因为+=需要左右两边都有值,而第6行刚定义,没有值可加。
这道题考的是C++静态成员变量的访问规则。静态成员变量(static成员)在类中声明,但在类外初始化,它属于类本身,而不是属于某个具体的对象。这意味着:
类名::变量,也可以写 对象名.变量。命题人故意把静态成员变量放在类里,然后让考生判断两行输出语句是否正确。很多初学者会混淆“静态成员”和“普通成员”的访问方式:
这道题就是利用这个知识点,看考生是否真正理解静态成员的本质。同时,命题人还埋了一个陷阱:第6行是初始化语句,不是赋值语句,考生容易误以为可以改成 objCounter += 1,但实际上 += 需要左右两边都有值,而第6行刚定义,没有值可加,所以语法错误。
拿到代码后,先看第14行:cout << newClass::objCounter << endl;
newClass 加上作用域运算符 ::,这是访问静态成员的标准写法。objCounter 是静态成员,所以这种访问方式完全合法。再看第15行:cout << classB.objCounter << endl;
classB 加上点运算符 .,这也是访问静态成员的一种合法方式。objCounter 是静态成员,但通过任意对象访问它也是可以的,因为所有对象共享同一份静态成员变量。所以两行代码都正确,答案选C。
objCounter += 1,因为 += 需要左右两边都有值,而第6行刚定义,没有值可加,所以语法错误。objCounter 是普通成员变量,那么第14行就会报错,因为普通成员变量必须通过对象访问,不能用类名访问。从题库数据看,静态成员变量属于GESP六级C++模块「面向对象」考点,历年考频如下:
基于历年考频数据,静态成员变量在GESP六级中的考频较高,且近年来题目数量呈上升趋势,预计未来几年该考点仍会保持较高频率。命题人可能会继续通过访问方式、初始化语句、静态成员与对象成员的区别等角度出题,考生需重点掌握静态成员的本质和访问规则。