首页 > 试题广场 >

下面关于一个类的静态成员描述中,不正确的是()

[单选题]
下面关于一个类的静态成员描述中,不正确的是()
  • 静态成员变量可被该类的所有方法访问
  • 该类的静态方法只能访问该类的静态成员函数
  • 该类的静态数据成员变量的值不可修改
  • 子类可以访问父类的静态成员
  • 静态成员无多态特性

我添加一下对“静态成员无多态特性”的理解,其他选项的解释参照其他牛人

首先,静态成员分静态数据成员跟静态成员函数。显然,这里我们只考虑静态成员函数。

而我们都知道,多态性是要通过指针或者引用才能体现出来的。但是,如果有引用或者指针的话,那代表着什么?说明,你必须申明对象。而我们知道静态成员函数是可以通过类直接访问的,所以这就是一个矛盾。

可能看了上面,你还是有疑问。再看看这个,

class A
{
    static int a;
public:
    virtual static void print()
    {
        cout << a << endl;
    }
};
int A::a = 1;
class B :public A
{
    static int b;
public:
    static void print()
    {
        cout << b << endl;
    }
};
int B::b = 2;
int main()
{
    A* aa = new B;
    //B bb;
    //cout << sizeof(*aa) << endl;   //答案为1,说明不存在vptr来指向一个虚表,下同
    //cout << sizeof(bb) << endl;
    aa->print();
    return 0;
}

如果认为静态成员函数存在多态的话,那就是aa->print(); 但是试想一下,如果我调用A::print(); B::print();你能分清我想调用那个函数?再想想既然有这样的通过类的调用形式,那多态还有什么意义?

调用StackOverflow 里面常说的解答,No, because it doesn't make any sense in C++.

参考网址:http://stackoverflow.com/questions/9863007/can-we-have-a-static-virtual-functions-if-not-then-why

编辑于 2017-02-21 09:13:44 回复(1)
静态成员在对象创建之前就已经分配空间,类的非静态成员要在对象创建后才有内存。
静态成员(方法)属于整个类,而不属于任何单个对象。
发表于 2016-08-29 22:11:58 回复(0)
静态成员由static声明,可以被任一对象修改,修改后的值可以被所有对象共享
常量有由final关键字声明,不可以修改
发表于 2016-06-14 17:17:09 回复(0)
类的静态成员属于整个类 而不是某个对象,可以被类的所有方法访问,子类当然可以父类静态成员;
静态方法属于整个类,在对象创建之前就已经分配空间,类的非静态成员要在对象创建后才有内存,所有静态方法只能访问静态成员,不能访问非静态成员;
静态成员可以被任一对象修改,修改后的值可以被所有对象共享。
发表于 2016-08-22 15:27:20 回复(0)
不可修改的是常量
发表于 2016-05-06 09:40:17 回复(0)
类的静态成员属于整个类 而不是某个对象,可以被类的所有方法访问,子类当然可以父类静态成员;
静态方法属于整个类,在对象创建之前就已经分配空间,类的非静态成员要在对象创建后才有内存,所有静态方法只能访问静态成员,不能访问非静态成员;
静态成员可以被任一对象修改,修改后的值可以被所有对象共享。

发表于 2016-05-25 12:17:38 回复(5)
求解 b选项静态方法不能间接访问该对象的非静态方法?
发表于 2019-08-28 10:58:07 回复(0)
类的静态成员属于整个类 而不是某个对象,可以被类的所有方法访问,子类当然可以父类静态成员; 静态方法属于整个类,在对象创建之前就已经分配空间,类的非静态成员要在对象创建后才有内存,所有静态方法只能访问静态成员,不能访问非静态成员; 静态成员可以被任一对象修改,修改后的值可以被所有对象共享。 首先,静态成员分静态数据成员跟静态成员函数。显然,这里我们只考虑静态成员函数。 而我们都知道,多态性是要通过指针或者引用才能体现出来的。但是,如果有引用或者指针的话,那代表着什么?说明,你必须申明对象。而我们知道静态成员函数是可以通过类直接访问的,所以这就是一个矛盾。 可能看了上面,你还是有疑问。再看看这个, class A { static int a; public: virtual static void print() { cout << a << endl; } }; int A::a = 1; class B :public A { static int b; public: static void print() { cout << b << endl; } }; int B::b = 2; int main() { A* aa = new B; //B bb; //cout << sizeof(*aa) << endl; //答案为1,说明不存在vptr来指向一个虚表,下同 //cout << sizeof(bb) << endl; aa->print(); return 0; } 如果认为静态成员函数存在多态的话,那就是aa->print(); 但是试想一下,如果我调用A::print(); B::print();你能分清我想调用那个函数?再想想既然有这样的通过类的调用形式,那多态还有什么意义? 调用StackOverflow 里面常说的解答,No, because it doesn't make any sense in C++. 参考网址:http://stackoverflow.com/questions/9863007/can-we-have-a-static-virtual-functions-if-not-then-why
编辑于 2018-11-29 11:24:17 回复(0)
bcd吧
发表于 2018-07-13 08:41:48 回复(0)
不对啊,存在权限问题啊,子类可以访问父类的private静态成员变量吗
发表于 2018-05-01 12:35:34 回复(0)
B选项中该类静态方法只能访问该类的静态成员函数,难道不能访问其他类的静态成员函数吗?
发表于 2018-04-09 22:16:08 回复(0)
静态成员和常量成员要分清楚,静态成员可以被任一一个对象改变,并被所有成员共享
发表于 2018-03-05 11:51:11 回复(0)
关于选项A,如果成员函数用const修饰的话,该成员函数不是只能调用const成员吗?此时还能访问static成员?
发表于 2017-07-12 11:35:14 回复(0)
静态成员可以被任一对象修改,修改后的值可以被所有对象共享。
发表于 2016-07-23 16:29:35 回复(0)
类的静态成员要熟悉
发表于 2016-06-28 11:25:21 回复(0)
有没有哪位同学解释一下:静态成员无多态特性 是什麽意思呢
发表于 2016-05-22 22:17:59 回复(2)
要将静态成员与常量区分开,常量初始公后不可以修改。
发表于 2016-05-16 13:17:17 回复(0)