成员变量

时间:2012-01-26 05:34:42

标签: c++ constructor initialization initialization-list

类中是否有成员变量不是static但需要定义 (作为保留内存的静态变量)?如果是这样,我可以举个例子吗?如果没有,那么为什么静态成员是唯一可定义的成员?

BJARNE说如果你想使用一个成员作为一个对象,你必须定义它。

但是当我明确定义成员变量时,我的程序显示错误:

class test{
    int i;
    int j;
  //...
};

int test::i; // error: i is not static member.

3 个答案:

答案 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)

在您的示例中,在类中声明ij也会定义它们。

见这个例子:

#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。