首页 > 试题广场 >

在下面的类定义中,横线上应填入的内容是()

[单选题]
在下面的类定义中,横线上应填入的内容是()(注意,count是在类外了)
class Fred {
public:
    void print() {
        cout << data << endl;
    }
    void setData(double d) {
        data = d;
    }
    static int count;
private:
    double data;
};
__________count = 0;


  • static int Fred::
  • int Fred::
  • int
  • static  int
请问这是什么玩意儿?
发表于 2017-07-09 19:26:18 回复(0)
视力题
发表于 2020-11-29 23:50:21 回复(0)
这题不是要考察眼力嘛
发表于 2018-04-19 14:13:47 回复(0)

为什么静态成员不能在类内初始化

在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样

class A
{ private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字 

为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。

什么东西能在类内初始化

能在类中初始化的成员只有一种,那就是静态常量成员。

这样不行

class A
{ private: static int count = 0; // 静态成员不能在类内初始化 };

这样也不行

class A
{ private: const int count = 0; // 常量成员也不能在类内初始化 };

但是这样可以

class A
{ private: static const int count = 0; // 静态常量成员可以在类内初始化 };

 

结论:

  • 静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化;
  • 静态非常量数据成员只能在类外,即类的实现文件中初始化,也不能在构造函数中初始化,不能在构造函数的初始化列表中初始化;
  • 非静态的常量数据成员不能在类内初始化,也不能在构造函数中初始化,而只能且必须在构造函数的初始化列表中初始化;
  • 非静态的非常量数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表中初始化;

 

总结如下表:

类型 初始化方式

类内(声明)

类外(类实现文件)

构造函数中

构造函数的初始化列表

非静态非常量数据成员

N

N

Y

Y

非静态常量数据成员

N

N

N

Y (must)

静态非常量数据成员

N

Y (must)

N

N

静态常量数据成员

Y

Y

N

N

 

 以下三种类型必须通过初始化列表来初始化
1.非静态 常量


2. 引用类型


3. 没有默认构造函数的类类型

发表于 2017-10-13 10:32:27 回复(11)
静态变量在类外初始化要加上::,同时不能再加static关键字了
发表于 2017-07-09 21:09:05 回复(7)
class MyClass
{
public:
    MyClass();
    ~MyClass();
private:
    /*类内部*/
    int a1 = 0;           //非静态非常量数据成员:可在类内声明赋初值
    const int a2 = 0;       //非静态常量数据成员  :可在类内赋初值
    static const int a3 = 0;     //静态常量数据成员  :可在类内赋初值
    static int a4 = 0;         //静态非常量数据成员  :不可在类内赋初值
private:

};
/*类外部*/
int MyClass::a1 = 1;        //错误提示:非静态成员不能在其类外部定义
const int  MyClass::a2 = 2;      //错误提示:非静态成员不能在其类外部定义
const int MyClass::a3 = 3;       //正确
int MyClass::a4 = 4;           //正确

MyClass::MyClass():a1(1),a2(2)   /*初始化列表*/
{
    /*构造函数中赋值*/
    a1 = 10; 
    a2 = 10;    //错误提示:表达式必须是可修改的左值(a2是常量当然不可修改)
}

MyClass::~MyClass()
{
}

1. 静态成员,无论是否是常量,都不可以在构造函数或初始化列表中初始化。
发表于 2018-02-20 11:11:31 回复(1)

这个题目考察的是C++类的静态成员,类的静态成员是属于整个类的,而不是属于某一个对象的,并且静态成员需要内类定义,类外初始化,初始化的时候可以不要static关键字,所以选B

这个题目可以做一个引申

什么东西可以在内类进行初始化呢?

答案是静态常量成员,类的静态成员是在内类定义,类外初始化的,类的常量成员必须要在初始化列表中初始化,但是类的静态常量成员是唯一可以在类内进行初始化的成员

例如:

编辑于 2020-04-09 22:33:53 回复(0)
我还以为要填的这行在private里头,是说这什么玩意呢  。。这个data后面的括号分号有点小隐蔽。。
发表于 2019-01-24 10:11:33 回复(0)
选b吧,静态成员初始化需在类定义外,不能加static且必须指定类限定符
发表于 2018-09-04 23:37:08 回复(0)
希望各位能帮我解答疑惑,如果有用帮我顶上去,让更多的人看到。
发表于 2018-02-05 21:27:18 回复(5)
类内定义,类外初始化
发表于 2023-09-11 14:43:09 回复(0)
非静态  非常量    类内初始化,构造函数,列表初始化

非静态  常量        类内初始化, 列表初始化

静态  非常量      类外初始化

静态   常量        类内初始化 , 类外初始化
发表于 2021-05-12 16:47:58 回复(1)
[注意] 横线属于类外,(上面封号是类的结束) 应该是初始化静态变量
发表于 2020-04-08 22:56:17 回复(0)
这个右花括号写的
发表于 2018-12-20 10:05:03 回复(0)

只要记住一点,静态成员只能在类外定义,而静态整形常量是唯一的特例即可。对于常量成员c++ 并没有规定一定只能在类内或类外定义。

发表于 2018-10-11 01:14:43 回复(0)
不应该是B吗?我滴天
发表于 2018-10-07 17:22:36 回复(0)
常量只能初始化不能赋值
发表于 2018-09-04 16:09:39 回复(0)
静态成员初始化必须在类外初始化(constexpr c++11中的除外
发表于 2017-08-09 14:28:45 回复(0)
这是java??
发表于 2017-07-12 18:52:15 回复(1)
C++中可用作用域解析符(::)来指定的外面的全局变量
发表于 2017-07-11 09:53:38 回复(0)