【问题标题】:How static member function can call the static private data member ? what kind of the internal transformation is needed?静态成员函数如何调用静态私有数据成员?需要什么样的内部改造?
【发布时间】:2015-02-12 20:57:38
【问题描述】:

想象一下我们有以下类:

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()。现在的问题是:没有“this”指针的函数如何访问类成员变量 m_a ?在 Lipman 的书中,我读到:

(( Point3d* ) 0 )-&gt;object_count();

其中object_count() 只是返回_object_count 静态数据成员。这个成语是如何演变的? ................................
................................
//调用的内部变换

object_count(( Point3d* ) 0 );

语言解决方案是引入静态成员函数 在官方 cfront Release 2.0 中。的主要特征 静态成员函数是它没有this 指针。

我不明白我们如何将 0 转换为类类型对象?

【问题讨论】:

  • 您将 0 转换为指针类型。不是类类型。静态方法通常也这样调用:A::get_sum() 而不是a.get_sum()。静态成员的重点是它们与类本身相关联,而不是与类的任何实例相关联。事实上,它们是在类的任何成员被实例化之前创建的。
  • 这是否意味着每个静态函数都有一个像这样的指针((类名*)0)并且使用这个指针可以访问类中的每个数据成员?
  • 我不知道实现细节,但我猜你可以这样想。编译器为类创建一个地址,他从该地址通过偏移量寻址静态成员。所以静态成员的地址在程序的整个生命周期中都是不变的。

标签: c++ class null this static-functions


【解决方案1】:

静态成员函数没有 this 指针,静态数据成员是特定于类而不是特定于对象的。因此,静态成员函数可以访问静态成员变量。

【讨论】:

  • 那么 object_count(( Point3d* ) 0 );内部转换?
猜你喜欢
  • 2020-03-22
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多