一个类中是否有一个成员变量不是static
但需要定义(因为定义了一个静态变量来保留内存)?如果是这样,我可以举个例子吗?如果不是,那么为什么静态成员是唯一可定义的成员?
BJARNE 说如果你想使用一个成员作为一个对象,你必须定义它。
但是当我明确定义成员变量时,我的程序显示错误:
class test{
int i;
int j;
//...
};
int test::i; // error: i is not static member.
一个类中是否有一个成员变量不是static
但需要定义(因为定义了一个静态变量来保留内存)?如果是这样,我可以举个例子吗?如果不是,那么为什么静态成员是唯一可定义的成员?
BJARNE 说如果你想使用一个成员作为一个对象,你必须定义它。
但是当我明确定义成员变量时,我的程序显示错误:
class test{
int i;
int j;
//...
};
int test::i; // error: i is not static member.
在这种情况下,您将使用 的构造函数的初始化列表来定义实例test
的初始值,如下所示:
class test {
int i;
int j;
//...
public:
test() : i(-12), j(4) {}
};
该定义为一个整数保留空间,但对于您创建的类的每个实例,实际上都会有一个单独的整数。如果您的程序创建了这么多test
.
每次创建类的实例时,都会在运行时为非静态成员分配空间。它由类的构造函数初始化。例如,如果您希望test::i
在每个实例中将整数初始化为数字 42,您可以这样编写构造函数:
test::test(): i(42) {
}
那么如果你这样做
test foo;
test bar;
你会得到两个对象,每个对象都包含一个值为 42 的整数。(当然,之后值可以改变。)
在您的示例中,在类中声明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
通过声明 type 的对象来访问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。