2012-01-26 3 views
0

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

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

Но моя программа показывает ошибку, когда я явно определить переменную-член:

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

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

Что вы ожидаете от этого? – Pubby

+0

@Pubby ТОГДА ЧТО БРАЙН НАСТОЯТЕЛЬНО ОЗНАЧАЕТ? –

ответ

0

В вашем примере, объявляющий i и j в классе ALS o определяет их.

Смотрите этот пример:

#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

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

class test { 
    int i; 
    int j; 
    //... 
public: 
    test() : i(-12), j(4) {} 
}; 
+0

Что означает это утверждение: -if (и только если) вы используете инициализированный элемент, находящийся вдали, который требует, чтобы он хранился как объект в памяти, член должен (определенно) определяться где-то. Инициализатор не может быть повторен. –

+0

@ 10001001058 это означает, что определение ('int test :: i (0);') * static * ('class test {static int i;/* ... * /};') должно существовать в одном месте только - обычно int 'test.cpp'. – justin

0

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

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

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

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

test foo; 
test bar; 

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

+0

Должен ли он определять статический член? –

+0

Да.Статические элементы не выделяются или не инициализируются конструктором класса, так как они не являются частью какого-либо экземпляра класса. Вот почему вы должны определить их отдельно. – Wyzard