类中是否有成员变量不是static
但需要定义
(作为保留内存的静态变量)?如果是这样,我可以举个例子吗?如果没有,那么为什么静态成员是唯一可定义的成员?
BJARNE说如果你想使用一个成员作为一个对象,你必须定义它。
但是当我明确定义成员变量时,我的程序显示错误:
class test{
int i;
int j;
//...
};
int test::i; // error: i is not static member.
答案 0 :(得分:0)
在这种情况下,您将使用test
的构造函数的初始化列表来定义实例的初始值,如下所示:
class test {
int i;
int j;
//...
public:
test() : i(-12), j(4) {}
};
答案 1 :(得分:0)
该定义为一个整数保留空间,但对于您创建的类的每个实例,实际上都会有一个单独的整数。如果您的程序创建了许多test
的实例,那么可能有一百万个。
每次创建类的实例时,都会在运行时分配非静态成员的空间。它由类的构造函数初始化。例如,如果您希望在每个实例中将整数test::i
初始化为数字42,那么您可以像这样编写构造函数:
test::test(): i(42) {
}
然后,如果你这样做
test foo;
test bar;
你得到两个对象,每个包含一个值为42的整数。(当然,值可以在此之后改变。)
答案 2 :(得分:0)
在您的示例中,在类中声明i
和j
也会定义它们。
见这个例子:
#include <iostream>
class Foo
{
public:
int a; // Declares and defines a member variable
static int b; // Declare (only) a static member variable
};
int Foo::b; // Define the static member variable
您现在可以通过声明a
类型的对象来访问Foo
,如下所示:
Foo my_foo;
my_foo.a = 10;
std::cout << "a = " << my_foo.a << '\n';
b
有点不同:因为它static
所有Foo
实例都相同:
Foo my_first_foo;
Foo my_second_foo;
Foo::b = 10;
std::cout << "First b = " << my_first_foo.b << '\n';
std::cout << "Second b = " << my_second_foo.b << '\n';
std::cout << "Foo::b = " << Foo::b << '\n';
对于上述所有内容,将打印b
为10。