2014-12-14 2 views
0

Только представьте, у нас есть следующий класс:Как статическая функция-член может вызвать статический частный элемент данных? Какая внутренняя трансформация необходима?

class A 
{ 
private: 
static int m_a; 
public: 
A() {} 
static int get_sum(int b); 
}; 

int A::m_a = 5; 

int A::get_sum(int b) 
{ 
return m_a + b; 
} 

int main() { 
    // your code goes here 
    A a; 
    int c = a.get_sum(10); 
    cout << "C=: " << c << endl; 
    return 0; 
} 

В коде выше, мы имеем класс, который содержит один частный, статическую переменную-член, который под названием в нашей общественной, статической функции-члена get_sum(). Теперь вопрос: как функция, которая не имеет этого «указателя», может обращаться к переменной-члену класса m_a? В книге Липман я прочитал, что:

((Point3d*) 0)->object_count();

где object_count() ничего не делает больше, чем возвращать статический член данных _object_count . Как изменилась эта идиома? ..............................
................. .............
// внутреннего преобразования вызова

object_count((Point3d*) 0);

язык решение было введение статических функций-членов в официальном Cfront Release 2.0. Первичной характеристикой является статическая функция-член, так как она не имеет указателя this.

Я не понимаю, как мы можем наложить 0 на объект типа класса?

+1

Вы вводите 0 в тип указателя. Не для класса. Также статический метод обычно называется так: 'A :: get_sum()' not 'a.get_sum()'. Точкой статических членов является то, что они связаны с самим классом, а не с каким-либо экземпляром класса. Фактически, они создаются до того, как кто-либо из членов класса будет проинструктирован. –

+0

Означает ли это, что каждая статическая функция имеет такой указатель ((имя класса *) 0) и используя этот указатель, он может получить доступ к каждому члену данных в класс? –

+1

Я не знаю деталей реализации, но вы можете думать об этом так, как я предполагаю. Компилятор создает адрес для класса, из которого он обращается к статическим членам посредством смещения. Таким образом, статический член имеет постоянный адрес на протяжении всего жизненного цикла программы. –

ответ

0

Статические функции-члены не имеют этого указателя, а статический член данных является специфичным для класса, а не специфичным для объекта. Таким образом, статические функции-члены могут обращаться к статическим переменным-членам.

+0

А как насчет object_count ((Point3d *) 0); внутреннее преобразование? –