переменная-член - PullRequest
       53

переменная-член

0 голосов
/ 26 января 2012

Может ли быть переменная-член в классе, которая не является static, но которую необходимо определить (как статическая переменная определяется для резервирования памяти)?Если да, могу ли я привести пример?Если нет, то почему статические члены являются единственными определяемыми элементами?

BJARNE сказал, что если вы хотите использовать элемент в качестве объекта, вы должны определить его.моя программа показывает ошибку, когда я явно определяю переменную-член:

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

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

Ответы [ 3 ]

0 голосов
/ 26 января 2012

Это определение резервирует пространство для одного целого числа, но на самом деле для каждого экземпляра создаваемого вами класса будет отдельное целое число.Их может быть миллион, если ваша программа создает столько экземпляров test.

. Место для нестатического члена выделяется во время выполнения каждый раз, когда создается экземпляр класса.Он инициализируется конструктором класса.Например, если вы хотите, чтобы целое число test::i было инициализировано числом 42 в каждом экземпляре, вы бы написали конструктор следующим образом:

test::test(): i(42) {
}

Тогда, если вы сделаете

test foo;
test bar;

вы получаете два объекта, каждый из которых содержит целое число со значением 42. (Значения могут измениться после этого, конечно.)

0 голосов
/ 26 января 2012

В вашем примере объявление 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.

0 голосов
/ 26 января 2012

в этом случае вы должны использовать список инициализации конструктора test для определения начальных значений для экземпляра , например, так:

class test {
    int i;
    int j;
  //...
public:
  test() : i(-12), j(4) {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...